SQLite subselect难题

时间:2013-05-20 16:18:14

标签: sqlite

SQLite3中的数据(说明性)。实际上有几百万行。

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

我的数据的键实际上是多列,但在这里我刚刚使用了第一列。

因此,我想查找与apple关联的所有键,然后使用它来查询与这些键关联的所有其他值。

这样的东西
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

2 个答案:

答案 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 :(得分: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的列已明确列出。)