目前我有一个查询返回父记录的父数据,父记录的子表记录子集等于某些值。但是,我想缩小它以仅返回具有某些值的子项的父记录,但是那些是属于给定父项的子记录,或者子记录的数量不超过给定总数。
这是一个示例查询,只能让我到达我需要的地方的一半:
SELECT parent.item1, parent.item2, parent.index
FROM parent
INNER JOIN child on parent.index = child.index
WHERE child.value IN (11111111, 33333333)
GROUP BY parent.item1, parent.item2, parent.index
HAVING COUNT(child.value) = 2
不幸的是,此查询返回任何父级数据,该数据具有“IN”语句中包含的已识别值的子集。我只希望父记录的父记录数据的子记录总数不超过一定数量(或者,在我的情况下,不要超过“IN”语句中的值数。是否有一种简单的方法可以实现这一点?
答案 0 :(得分:5)
您要求的查询是:
SELECT parent.item1, parent.item2, parent.index
FROM parent
INNER JOIN
child
ON child.index = parent.index
GROUP BY
parent.item1, parent.item2, parent.index
HAVING SUM(CASE WHEN child.value IN (1111111, 2222222) THEN 1 ELSE 0 END) = 2
AND COUNT(*) <= 2
如果您只是想确保子项匹配IN
列表中的所有值,而不是列表中的所有值,请使用此项(在SQL Server
中)
SELECT *
FROM parent p
WHERE NOT EXISTS
(
SELECT NULL
FROM (
SELECT value
FROM child c
WHERE c.index = p.index
) c
FULL JOIN
(
SELECT 11111111 AS value
UNION ALL
SELECT 22222222
) q
ON c.value = q.value
WHERE c.value IS NULL OR q.value IS NULL
)