2014-07-25 26 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可以使用這些索引來搜索「相關」行。