从union中选择SQL只返回第一个匹配项

时间:2015-04-16 14:04:31

标签: sql select union

我想从两个小列表中获取唯一值,并使用结果从大列表中选择它们。但是,只返回第一个结果。我做错了什么?

查询:

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。

4 个答案:

答案 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)