2014-07-25 28 views
1

我试着想一个SQL查询得到的结果由来自多个记录多列,该表是一样的:名单列

key_1  key_2 
-------------------- 
1   2 
1   3 
1   4 
5   6 

两个key_1和key_2是另一个表的主键。而结果,我想获得越来越每次都与键键“1”,这就是:

key 
-------- 
1 
2 
3 
4 

我尝试以下查询:

SELECT key_1 as key FROM tbl_keys_link WHERE key_1 IN (1) 
UNION 
SELEVY key_2 as key FROM tbl_keys_link WHERE key_2 IN (1) 

但我使用pgAdmin的的检查它'解释'函数,似乎这个查询的处理时间不是非常优化的。有没有其他方法来构建查询以获得更好的性能?谢谢!

回答

1

您可以尝试措辞查询是这样的:

select a.key 
from anothertable a 
where exists (select 1 from tbl_keys_link p pairs.key_1 = a.key and pairs.key_2 = 1) or 
     exists (select 1 from tbl_keys_link p pairs.key_2 = a.key and pairs.key_1 = 1); 

出于性能考虑,你会想要两个指标:tbl_keys_link(key_1, key_2)tbl_keys_link(key_2, key1)

这消除了重复的消除步骤(不同的)所需的步骤。另外,查询应该只扫描另一个表并执行一个或两个索引查找来识别匹配的键。

+0

我创建了索引对(key_1,key_2),但是当我尝试使用您建议的SQL时,它指出这是关于使用对p的错误(错误消息:“对”是一个索引。)并且我不确定的一件事是,根据WHERE子句中的条件,在外部执行SELECT时,exists子句应该至少包含1条记录,但在引用上表时,值“1”发生在列key_1中,所以我认为这个查询会返回一个空的结果? – alanlo

+0

@alanlo。 。 。 '对'只是我用于表格的名字。你说得对。两个条款之间的关系应该是逻辑的而不是'和'。 –

0

你可以试试这个:

with keys as (
    select key_1, key_2 
    from tbl_keys_link 
    where key_1 = 1 
    or key_2 = 1 
) 
SELECT distinct unnest(array[key_1, key_2]) 
from keys 
order by 1; 

但我不知道,如果这是更有效的。至少它只需要扫描一次表格。如果每列都有索引,Postgres可以使用这些索引来搜索“相关”行。