繁体   English   中英

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

[英]sql: select rows where group of elements occurs several times in the table

我正在寻找以下伪代码的实现:

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

如何实现呢? 我的伪代码的问题在于,COUNT可以接受单列或所有列(*),但不能接受4列中的2列。 GROUP BY具有相同的属性。

对于支持分析功能的RDMS,您可以执行

SELECT a,b,c
FROM
(
  SELECT a, b, c, count(1) OVER(PARTITION BY a,b) cnt
  FROM X
)t1
WHERE t1.cnt >1

如果分析/窗口功能不可用,则应该执行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值。

最好在x(a, b)上使用索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM