我想从两个小列表中获取唯一值,并使用结果从大列表中选择它们。但是,只返回第一个结果。我做错了什么?
查询:
SELECT DISTINCT b.keys, b.names
FROM biglist b
WHERE
b.keys = (SELECT keys FROM partial_list_1 UNION SELECT keys FROM partial_list_2)
使用正常的测试列表进行查询,这可以按预期工作:
SELECT DISTINCT b.keys, b.names
FROM biglist b, smalllist s
WHERE
b.keys = s.keys
//编辑:我正在使用SpatiaLite。
答案 0 :(得分:2)
您应该使用IN
:
SELECT DISTINCT b.keys, b.names
FROM biglist b
WHERE
b.keys IN (SELECT keys FROM partial_list_1 UNION SELECT keys FROM partial_list_2)
答案 1 :(得分:2)
使用or
:
SELECT DISTINCT b.keys, b.names
FROM biglist b
WHERE b.keys IN (SELECT keys FROM partial_list_1) OR
b.keys IN (SELECT keys FROM partial_list_2);
这些可以利用partial_list_1(keys)
和partial_list_2(keys)
上的索引 - 两者都是推荐的。 (某些数据库可能需要将其表示为exists
才能利用索引。)
答案 2 :(得分:2)
这个条件:
b.keys = (SELECT keys FROM partial_list_1 UNION SELECT keys FROM partial_list_2)
要求子查询生成单个值。如果没有,则查询无效。您的特定DBMS可以通过选择子查询返回的一个元素来处理它,但是它可能会引发错误。
这可以做你想要的:
SELECT DISTINCT b.keys, b.names
FROM
biglist b
INNER JOIN (
SELECT keys FROM partial_list_1
UNION
SELECT keys FROM partial_list_2
) s
ON b.keys = s.keys
答案 3 :(得分:1)
你几乎就在那里。将等于运算符更改为IN
SELECT DISTINCT b.keys, b.names
FROM biglist b
WHERE
b.keys IN (SELECT keys FROM partial_list_1 UNION SELECT keys FROM partial_list_2)
或者您可以使用可能运行得更快的EXISTS
SELECT DISTINCT b.keys, b.names
FROM biglist b
WHERE EXISTS (SELECT 1 FROM partial_list_1 t1 WHERE t1.keys = b.keys)
OR EXISTS (SELECT 1 FROM partial_list_2 t1 WHERE t1.keys = b.keys)