Don*_*Don 5 mysql sql sql-server
目前,我有一个查询返回父记录的父数据,父记录的子表记录子集等于某些值.但是,我想缩小它以仅返回具有特定值的子节点的父记录,但是那些是属于给定父节点的唯一子记录,或者子记录的数量不超过给定总计的子记录.
这是一个示例查询,只能让我到达我需要的位置的一半:
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
Run Code Online (Sandbox Code Playgroud)
不幸的是,此查询返回任何父级的数据,该数据具有"IN"语句中包含的已识别值的子集.我只希望父记录的父记录数据的子记录总数不超过一定数量(或者,在我的情况下,不要超过"IN"语句中的值数.是否有一种简单的方法可以实现这一点?
您要求的查询是:
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
Run Code Online (Sandbox Code Playgroud)
如果您只想确保子项与IN列表中的所有值匹配,而不是列表中没有,请使用此(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
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4097 次 |
| 最近记录: |