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
我想从两个小列表中获取唯一值,并将结果用于 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