2013-11-21 89 views
1

SQL中有UNIONUNION ALL運算符。第一個刪除所有重複,第二個不重複。我想只刪除源自不同子查詢的重複項,但保留來自同一個子項的重複項。例如:Semi-distinct union

TABLE t1:  TABLE t2:  TABLE t3: 
a | b   a | b   a | b 
—————   —————   ————— 
1 | 2   1 | 2   1 | 3 
1 | 2      1 | 3 

我想(SELECT * FROM t1) UNION SEMI (SELECT * FROM t3)返回所有四行,
然後(SELECT * FROM t2) UNION SEMI (SELECT * FROM t2)返回一行。
我真的不在乎什麼
(SELECT * FROM t1) UNION SEMI (SELECT * FROM t2)會返回,但它會很好,如果以某種方式依賴於子查詢的順序,例如, G。在最後一個例子中,它將是兩行,並且反過來(t2 UNION t1) - 一個。

我可以做一個巨大的查詢,但問題是 - 是否有這樣的操作的標準方法?
在此先感謝。

+0

不,我不認爲有一個內置的操作這一點。我認爲這是一個非常不尋常的要求。什麼是用例? – Barmar

+0

@Barmar粗略地說,我有兩個表A和B.有時來自A的條目被複制到B,有時被移動。我需要了解一開始在表A中有多少條記錄。我將兩個表格清楚地結合在一起,因此一張表格中的相似行會丟失,這並不酷。有這樣的業務邏輯,要麼沒有相同的行被複制到B或一次全部。所以,如果N個相似的行還沒有被複制,或者已經被複制,或者已經被移動,我需要'union'來返回數字N.當然,我只能在該項目中選擇。 –

+0

所以你想要聯合表1與表2中的所有行不匹配表1中的任何內容。 – Barmar

回答

1

你想要的table1工會與table2所有行沒有匹配的行中table1

SELECT * 
FROM table1 

UNION ALL 

SELECT t2.* 
FROM table2 t2 
LEFT JOIN table1 t1 USING (a, b, ...) -- list all the columns here 
WHERE t1.a IS NULL 
+0

多好啊,這是我想要的完全不對稱的'union semi'。謝謝。 –