2012-01-09 96 views
11

如何在執行UNION後對單個列執行DISTINCT操作?SELECT UNION as DISTINCT

T1 
-- 
ID Value 
1 1 
2 2 
3 3 

T2 
-- 
ID Value 
1 2 
4 4 
5 5 


我試圖返回表:

ID Value 
1 1 
2 2 
3 3 
4 4 
5 5 

我想:

SELECT DISTINCT ID, Value 
FROM (SELECT*FROM T1 UNION SELECT*FROM T2) AS T3 

這似乎並沒有工作。

+1

- 以什麼方式? – 2012-01-09 00:39:26

+0

你沒有給我們所有的細節,它的值總是必須與場1,最小值,最大值,隨機值相同......任何方式都不同於所有場,而不僅僅是一場。 – 2012-01-09 00:50:41

+2

看到我的答案比你選擇的更好的答案 – Bohemian 2012-01-09 01:13:50

回答

15

至於我可以說,沒有「一欄distinct」:distinct總是應用於整個記錄(除非像count(distinct name)的集合中使用)。原因是,SQL無法猜測哪個值爲Value要離開你,以及哪個值會丟失。這是你需要自己定義的東西。

嘗試使用GROUP BY確保ID是不能重複的,和任何集合(這裏MIN,因爲在你的例子是倖存的最小)選擇的Value特定值:

SELECT ID, min(Value) FROM (SELECT * FROM T1 UNION ALL SELECT * FROM T2) AS T3 
GROUP BY ID 

應該是完全你需要什麼。也就是說,它不是相同的查詢,並且沒有distinct-但它是一個查詢,它將返回示例中顯示的內容。

+0

你確定這是相同的查詢? – 2012-01-09 00:42:43

+0

我建議在子查詢中使用'UNION ALL',因爲在執行兩次'DISTINCT'時沒有意義。 – 2012-01-09 00:44:11

+0

@MitchWheat我確定它不是 - 但它是一個查詢,它將返回示例中顯示的內容。 – alf 2012-01-09 00:44:39

25

你爲什麼使用子查詢?這將工作:

SELECT * FROM T1 
UNION 
SELECT * FROM T2 

UNION刪除重複項。 (UNION ALL沒有)

+0

Point是,OP想要一種叫做「單場DISTINCT」的東西,而且沒有這樣的概念。 – alf 2012-01-09 10:16:14

+1

這必須是被接受的答案。 – 2016-11-23 08:27:28

+0

如果您的UNION記錄[1,1]和[1,2],您將在結果集中得到兩者。 OP不希望第一列重複。顯然這個答案對很多人都有幫助,但我不認爲它回答了問題。 – user7733611 2017-11-09 16:58:46

2

即使這個線程已經過時 - 可能是OP問題的工作解決方案,即使它可能被認爲是髒的。

我們從第一個表中的所有元組, 然後加入(工會),它與第二個表僅限於那些母鹿沒有在第一個表匹配的特定領域的元組。

SELECT * 
    FROM T1 
UNION 
SELECT * 
    FROM T2 
    WHERE (
    Value NOT IN (SELECT Value FROM T1) 
); 
3

我想這就是你的意思:「這似乎不工作」

SELECT * 
    FROM T1 
UNION 
SELECT * 
    FROM T2 
    WHERE (
    **ID 
** NOT IN (SELECT ID FROM T1) 
); 
+0

我真的認爲這應該是問題的接受答案。它可以讓您優先選擇哪個表獲取從中選擇的值,而不是使用GROUP BY執行MIN()。取決於OP如何選擇價值。 – user7733611 2017-11-09 17:05:10