2013-07-22 94 views
2

我的問題與Multiple NOT distinct非常相似,只處理多列而不是一列。我有一個表像這樣:從兩列中選擇不同的行

A B C 
1 1 0 
1 2 1 
2 1 2 
2 1 3 
2 2 4 
2 3 5 
2 3 6 
3 1 7 
3 3 8 
3 1 9 

而且結果應該是:

A B C 
2 1 2 
2 1 3 
2 3 5 
2 3 6 
3 1 7 
3 1 9 

從本質上講,像上面的問題,刪除所有獨特的條目只有在唯一性是由兩列,而不是一個確定的。我已經嘗試過對上述答案進行各種調整,但無法讓他們工作。

回答

2

您正在使用SQL Server,所以這是不是在訪問更容易:

select A, B, C 
from (select t.*, count(*) over (partition by A, B) as cnt 
     from t 
    ) t 
where cnt > 1; 

此使用的count(*)是作爲窗口函數。它正在計算具有相同值AB的行數。最後的where只選擇具有多個條目的行。

+0

就像一個魅力!謝謝!任何關於OVER和PARTITION BY陳述正在做什麼的澄清? –

+0

@ 1215drew-NWR-。 。 。這些用於窗口功能,這是非常有用的。數據庫文檔涵蓋了這些非常好(至少SQL Server和Oracle)。它們是標準和隨時可用的組件(例如SQL Server,Oracle,Postgres,DB2)。我知道我在我的書「使用SQL和Excel進行數據分析」中介紹了它們。基本的SQL書籍通常不涉及這個主題。 –

+0

謝謝,我會深入研究一下文檔,也許看看你的書。 –

1

EXISTS

SELECT a, b, c 
    FROM Table1 t 
WHERE EXISTS 
(
    SELECT 1 
    FROM Table1 
    WHERE a = t.a 
    AND b = t.b 
    AND c <> t.c 
) 

另一種可能的解決方案應該是足夠快。

輸出:

 
| A | B | C | 
------------- 
| 2 | 1 | 2 | 
| 2 | 1 | 3 | 
| 2 | 3 | 5 | 
| 2 | 3 | 6 | 
| 3 | 1 | 7 | 
| 3 | 1 | 9 | 

這裏是SQLFiddle演示