SQL select 仅来自联合 returns 第一场比赛

SQL select from union only returns the first match

我想从两个小列表中获取唯一值,并将结果用于 select 大列表中的值。但是,只返回第一个结果。我做错了什么?

查询:

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。

你快到了。将您的相等运算符更改为 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)

你应该使用 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)

通常使用 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 以利用索引。)

这个条件:

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