我有两个非常简单的表:t1
和t2
,其中包含以下行:
表t1
:
id, name
1 PBN
表t2
:
id, name
100 FIBERHOME
查询1:
SELECT name FROM t1 UNION SELECT name FROM t2 WHERE id IN (1)
结果是:PBN
查询2:
SELECT name FROM t1 UNION SELECT name FROM t2 WHERE id IN (100)
结果是:PBN,FIBERHOME
但预期的结果是:FIBERHOME ..!是什么原因?
答案 0 :(得分:2)
UNION总结了两个结果。
在第一个查询中,没有条件因此它返回 PBN ,然后它会添加第二个结果的结果 FIBERHOME 。
使用UNION你可以尝试:
SELECT name FROM t1 WHERE id IN (100) UNION SELECT name FROM t2 WHERE id IN (100)
答案 1 :(得分:2)
要扩展@Knep的答案,如果您只想要一个WHERE id IN ()
:
SELECT name FROM (
SELECT id, name FROM t1
UNION
SELECT id, name FROM t2
) unioned
WHERE id IN (1,100)
可能速度不快,所以最好测试。
另请注意,id
需要位于外部WHERE
中使用的子查询中。
我认为WHERE子句是全局的 - @szpal
要回答关于为什么WHERE未用于UNION中的所有查询的问题,请考虑两个不共享列的查询。
自己:
SELECT id, name FROM x WHERE colA = 123
和
SELECT id, name FROM y WHERE colB = 456
然后与(不正确的)单个WHERE子句一起:
SELECT id, name FROM x
UNION
SELECT id, name FROM y
WHERE colB = 456 -- But table x doesn't have a colB!
如果(正确)WHERE子句与每个查询一致:
SELECT id, name FROM x
WHERE colA = 123 -- I have a colA, still don't have a colB
UNION
SELECT id, name FROM y
WHERE colB = 456 -- I have a colB, still don't have a colA
每个人都是胜利者!
答案 2 :(得分:0)
第二个查询中的where条件将在union之前执行。
SELECT name FROM t1
将返回
id name
1 PBN
SELECT name FROM t2 WHERE id IN (100)
将返回
id name
null null
联盟将以上两个结果组合为
SELECT name FROM t1 UNION SELECT name FROM t2 WHERE id IN (100)
id name
1 PBN
您可以通过
解决此问题SELECT
name
FROM
(SELECT
*
FROM
interns_test_db.t1 UNION SELECT
*
FROM
interns_test_db.t2) A
WHERE
ID IN (100)
但这可能会降低性能。