2013-07-22 74 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演示