数据库架构的组织如下:
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
答案 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