【问题标题】:Return parent records with child records equaling specific values AND where total set of child records for a given parent equal a specific value返回具有等于特定值的子记录的父记录,并且给定父级的子记录的总集等于特定值
【发布时间】:2011-04-03 04:13:57
【问题描述】:

目前我有一个查询,它返回父记录的父数据,这些父记录的子表记录的子集等于某些值。但是,我想将其缩小为仅返回具有特定值的子记录的父记录,但这些父记录是属于给定父记录的唯一子记录,或者子记录的数量不超过给定总数。

这是一个示例查询,它只能让我到达我需要到达的地方的一半:

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”语句中的值的数量。有没有简单的方法来完成这个?

【问题讨论】:

    标签: sql mysql sql-server


    【解决方案1】:

    您要求的查询是:

    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
            )
    

    【讨论】:

    • 哇...快速响应-谢谢!在这种情况下,父级应该只有 2 个子记录。但是,使用此解决方案,我仍然从具有 3 个子记录的父级获取数据(具有一个子集,而不是具有标识值的子记录的总集)。
    • @Don:在原始回复中,4 只是一个限制孩子的“特定数字”(3 匹配此)。立即尝试。
    • 我发现第一个解决方案适用于 HAVING 子句,编码如下: HAVING SUM(CASE WHEN child.value IN (11111111, 33333333) THEN 1 ELSE 0 END) = 2 AND COUNT(*) = 2 -- 这会过滤掉任何有超过 2 个子记录的父项
    • 我可以更进一步,在最终结果中显示 child.value 以及注明的父数据吗?
    • @Don: 两个孩子中的哪个child.value 匹配?既然他们被保证是11111113333333,为什么还要打扰他们呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多