返回父记录,其中子记录等于特定值,并且给定父级的子记录总数等于特定值

时间:2010-08-24 13:17:22

标签: sql mysql 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

不幸的是,此查询返回任何父级数据,该数据具有“IN”语句中包含的已识别值的子集。我只希望父记录的父记录数据的子记录总数不超过一定数量(或者,在我的情况下,不要超过“IN”语句中的值数。是否有一种简单的方法可以实现这一点?

1 个答案:

答案 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
        )