SQL Query获取具有重复值但不属于同一组的所有行

时间:2012-07-10 15:07:41

标签: sql count grouping distinct

数据库架构的组织如下:

ID | GroupID | VALUE
--------------------
 1 |    1    |   A
 2 |    1    |   A 
 3 |    2    |   B
 4 |    3    |   B

在这个例子中,我想要获得具有重复VALUE的所有行,但不是同一组的一部分。因此,期望的结果集应该是ID(3,4),因为它们不在同一组(2,3)中,但仍具有相同的VALUE(B)。

我在编写SQL查询时遇到问题,并希望得到任何指导。感谢。

到目前为止,我正在使用SQL Count,但无法弄清楚如何处理GroupId。

SELECT * 
FROM TABLE T
HAVING COUNT(T.VALUE) > 1
GROUP BY ID, GroupId, VALUE

3 个答案:

答案 0 :(得分:6)

最简单的方法是使用EXISTS

SELECT 
    ID 
FROM
    MyTable T1
WHERE
    EXISTS (SELECT 1
            FROM MyTable 
            WHERE Value = t1.Value
            AND GroupID <> t1.GroupID)

答案 1 :(得分:1)

这是一种方法。首先,您必须确定出现在多个组中的值,然后使用该信息在原始表中查找正确的行:

select *
from t
where value in (SELECT value
                FROM TABLE T
                GROUP BY VALUE 
                HAVING COUNT(distinct groupid) > 1
               )
order by value

实际上,在这种情况下,我更喜欢通过更改HAVING子句的轻微变体:

HAVING min(groupid) <> max(groupid)

当您要查找多个组并且应该比COUNT DISTINCT版本更快时,这是有效的。

答案 2 :(得分:0)

SELECT  ALL_.* 
FROM    (SELECT  *  
         FROM    TABLE_
         GROUP BY ID, GROUPID, VALUE
         ORDER BY ID) GROUPED,
         TABLE_ ALL_
WHERE    GROUPED.VALUE = ALL_.VALUE
AND      GROUPED.GROUPID <> ALL_.GROUPID