sql:选择元素组在表中多次出现的行

sql:选择元素组在表中多次出现的行,sql,Sql,我正在搜索以下pseodo代码的实现: SELECT A, B, C FROM X HAVING COUNT(A,B) > 1 下面是代码应该执行的操作的示例: 假设表X如下所示: A B C D -------------- 1 1 0 2 1 1 1 1 2 1 1 0 第一行和第二行在A列和B列中具有相同的条目,第三列在B列中相同,但在A列中不同。所需的输出是第1行和第2行的A、B和C列: 1 1 0 1 1 1

我正在搜索以下pseodo代码的实现:

SELECT A, B, C
FROM X
HAVING COUNT(A,B) > 1
下面是代码应该执行的操作的示例:

假设表X如下所示:

A   B   C   D
--------------
1   1   0   2
1   1   1   1
2   1   1   0
第一行和第二行在A列和B列中具有相同的条目,第三列在B列中相同,但在A列中不同。所需的输出是第1行和第2行的A、B和C列:

1   1   0
1   1   1

如何实现这一点?我的pseodo代码的问题是,COUNT接受单个列或所有列*,但不能从4列中抽取两列。GROUP BY具有相同的属性。

对于支持分析函数的RDM,可以执行以下操作

SELECT a,b,c
FROM
(
  SELECT a, b, c, count(1) OVER(PARTITION BY a,b) cnt
  FROM X
)t1
WHERE t1.cnt >1
如果分析/windows功能不可用,则join应执行此操作

SELECT t1.a, t1.b, t1.c 
FROM X t1
INNER JOIN 
(
  SELECT a,b
  FROM X 
  GROUP BY a,b
  HAVING COUNT(1) >1
)t2 ON (t2.a=t1.a AND t2.b=t1.b)
可以使用exists子句执行此操作。这应适用于所有数据库:

select a, b, c
from x
where exists (select 1
              from x x2
              where x.a = x2.a and x.b = x2.b and x.c <> x2.c
             );
这假设行具有不同的c值


这将在xa,b上有一个索引时表现最好。

非常优雅的解决方案,在没有x.c x2.c的情况下也能工作。实际上,我并不介意c列中的条目是否相同。谢谢!关于我的最后一条评论,还有一点需要注意:当然,我们需要x.c x2.c,其中c是任意列,因为如果不这样,也会选择单个出现,它将在exists测试中找到完全相同的行