You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server如何判断一组记录是否被另一组记录包含

找出被其他组包含的组的grp_id(SQL Server)

嘿,作为SQL Server新手,我完全懂你对位运算繁琐的感受——咱们换个更直观、可靠的方法来解决这个问题!

核心思路

我们要找的是所有item都被至少另一个不同组完全包含的grp_id。换句话说,对于目标组g1,存在另一个组g2(g2≠g1),g1的每一个item_val都能在g2里找到。

方案一:使用多层EXISTS子查询(推荐,准确可靠)

这个方法通过嵌套的EXISTS来检查“g2是否包含g1的所有项”,逻辑清晰且不会有边界问题:

SELECT DISTINCT g1.grp_id
FROM tmp_grp g1
WHERE EXISTS (
    -- 检查是否存在另一个不同的组g2
    SELECT 1
    FROM tmp_grp g2
    WHERE g2.grp_id <> g1.grp_id
    -- 确认g2包含g1的所有item:g1中没有任何一个item是g2没有的
    AND NOT EXISTS (
        SELECT 1
        FROM tmp_grp g1_items
        WHERE g1_items.grp_id = g1.grp_id
        AND NOT EXISTS (
            SELECT 1
            FROM tmp_grp g2_items
            WHERE g2_items.grp_id = g2.grp_id
            AND g2_items.item_val = g1_items.item_val
        )
    )
)

结果验证

用你提供的测试数据,这个查询会返回grp_id=1和grp_id=2:

  • grp1的item是'A',被grp2、3、4、5都包含
  • grp2的item是'A'和'B',被grp3和grp5包含

方案二:结合组内item数量优化性能

如果数据量较大,我们可以先统计每个组的item数量,提前过滤掉不可能包含当前组的候选组(item数比当前组少的组肯定无法包含它),提升查询效率:

WITH GroupItemCounts AS (
    -- 先统计每个组的item数量
    SELECT grp_id, COUNT(*) AS item_count
    FROM tmp_grp
    GROUP BY grp_id
)
SELECT DISTINCT g1.grp_id
FROM tmp_grp g1
JOIN GroupItemCounts gc1 ON g1.grp_id = gc1.grp_id
WHERE EXISTS (
    SELECT 1
    FROM tmp_grp g2
    JOIN GroupItemCounts gc2 ON g2.grp_id = gc2.grp_id
    WHERE g2.grp_id <> g1.grp_id
    AND gc2.item_count >= gc1.item_count -- 只考虑item数足够多的组
    AND NOT EXISTS (
        SELECT 1
        FROM tmp_grp g1_items
        WHERE g1_items.grp_id = g1.grp_id
        AND NOT EXISTS (
            SELECT 1
            FROM tmp_grp g2_items
            WHERE g2_items.grp_id = g2.grp_id
            AND g2_items.item_val = g1_items.item_val
        )
    )
)

注意:避免使用字符串拼接的方法(有风险)

虽然你可能想到用STRING_AGG把item拼接成字符串再用LIKE匹配,但这种方法存在误判风险——比如如果g1的item是'A,B',g2的item是'A,AB,C',LIKE会错误认为g2包含g1。所以仅当你的item_val是完全独立的、不会互相包含的字符串(比如单个字符、唯一编码)时才考虑使用,否则优先用上面的EXISTS方案。

内容的提问来源于stack exchange,提问作者Eric

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:03:51