2014-10-28 62 views
2

我想在两个表上使用联合运算符。我希望结果集消除由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。任何可以做的事情?

+0

所以你想你的结果集包含1,2,2,3,4? – DavidG 2014-10-28 17:12:26

+0

@DavidG ...是的。 – 2014-10-28 17:13:42

回答

4

你说这样的事情:

select * from foo 
UNION ALL 
select * from bar 
where not exists (select * from foo where foo.x = bar.x) 
+0

丢失'from' :) – DavidG 2014-10-28 17:16:40

+0

今天早上还没有喝过我的咖啡:) – 2014-10-28 17:18:26

+0

早上好!现在差不多五点半在这里,已经淹没在我的!无论如何,+1! – DavidG 2014-10-28 17:18:58

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) 
+0

+1使用CTE和原始数据。 – DavidG 2014-10-28 17:20:31