2

数据库模式组织如下:

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
4

3 回答 3

6

最简单的方法是使用EXISTS

SELECT 
    ID 
FROM
    MyTable T1
WHERE
    EXISTS (SELECT 1
            FROM MyTable 
            WHERE Value = t1.Value
            AND GroupID <> t1.GroupID)
于 2012-07-10T15:23:30.933 回答
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 版本更快的情况。

于 2012-07-10T15:20:41.970 回答
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
于 2012-07-10T15:23:39.530 回答