我有两个非常简单的表:包含以下行的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
但预期的结果是:纤维之家!原因何在?
发布于 2016-02-25 10:36:40
扩展@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
要回答为什么UNION中的所有查询都不使用WHERE的问题,请考虑两个不共享列的查询。
靠他们自己:
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每个人都是赢家!
发布于 2016-02-25 10:31:36
联合总结了这两个结果。在第一个查询中,没有条件,因此它返回PBN,然后添加第二个结果FIBERHOME的结果。
使用UNION,您可以尝试:
SELECT name FROM t1 WHERE id IN (100) UNION SELECT name FROM t2 WHERE id IN (100)发布于 2016-02-25 10:39:00
第二个查询中的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)但这可能会降低性能。
https://stackoverflow.com/questions/35624578
复制相似问题