2014-10-28 43 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