联盟 - 仅删除由联盟创建的重复项

时间:2014-10-28 17:07:17

标签: sql sql-server tsql

我想在两个表上使用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。有什么可以做的吗?

2 个答案:

答案 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)