我想在两个表上使用union运算符。我希望结果集消除由UNION创建的重复值,但不能消除表中预先存在的重复值。考虑一下这段代码......
select
b
from
(values (1), (2), (2), (3)) as a(b)
union
select b from (values (2), (4)) as c(b)
我希望这能产生一个包含两个2而不是三个的结果集。当然,目前我得到一个2,如果我使用UNION ALL
代替,我会得到三个2' s。有什么可以做的吗?
答案 0 :(得分:4)
你说的是这样的话:
select * from foo
UNION ALL
select * from bar
where not exists ( select * from foo where foo.x = bar.x )
答案 1 :(得分:2)
只需从第二个表中排除您不想要的行。
WITH t1 AS
(
SELECT c
FROM (
VALUES (1), (2), (2), (3)
) t(c)
)
, t2 AS
(
SELECT c
FROM (
VALUES (2), (4)
) t(c)
)
SELECT c
FROM t1
UNION ALL
SELECT c
FROM t2
WHERE c NOT IN (SELECT c FROM t1)