2013-05-20 62 views
2

SQLite3中的數據(說明性)。實際上有幾百萬行。SQLite子查詢難題

a, aardvark 
a, anvil 
a, apple 
a, automaton 
b, apple 
b, peanut 
b, persimmon 
b, walnut 

主要用於我的數據實際上是多列,但在這裏我只是使用的第一列。

所以,我想找到所有與蘋果關聯的鍵,然後用它來查詢與這些鍵相關的所有其他值。

喜歡的東西

select * from data where key in (select key from data where element = apple); 

但不工作,因爲多列鍵可能:

select * 
from data 
where k1, k2, k3, k4 in (select k1, k2, k3, k4 from data where element = "apple"); 

的思考?謝謝!!

TC

+0

我想知道這是否僅僅是內部連接,但仍不確定如何處理給定的多列鍵... –

回答

1

這會給你所有的數據:

select * 
from data d1 
left join data d2 ON (d1.k1 = d2.k1) AND (d1.k2 = d2.k2) AND etc... 
where d1.element = "apple" 

那麼你就必須清理的結果,排除重複,做其他任何結果集的準備,你可能有興趣在

+1

Ryan,這節省了我的培根 - 並坦率地讓我永遠離開SQL。我現在正在轉向Redis ...... –

1

這是基於Ryan的想法,但DISTINCT已經消除了重複鍵和NATURAL加入避免了需要寫出所有關鍵的比較:

SELECT d1.* 
FROM data AS d1 
NATURAL INNER JOIN (SELECT DISTINCT k1, k2, k3, k4 
        FROM data 
        WHERE element = 'apple' 
        ) AS d2 

(自然連接可能是危險的,因爲它是可能的表可能會無意中後來改讓更多的列具有匹配的名稱,但在這裏它是安全的,因爲d2的列被明確列出。)

+0

我喜歡這個CL - 謝謝! –