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

多对多关联表/三表结构下,查询多母亲共有的子项方法

嘿,我来帮你搞定这两个多对多关联的查询问题!

问题1:查询所有母亲共有的子项

要找出所有母亲都共同拥有的子项,核心思路是统计每个子项关联的母亲数量,然后筛选出数量等于总母亲数的子项。具体实现步骤如下:

  1. 先计算数据库中总共有多少个不同的母亲:
    SELECT COUNT(DISTINCT CodeMother) AS total_mothers FROM Mother;
    
  2. 接着统计每个子项关联的母亲数量,筛选出数量等于总母亲数的子项:
    SELECT c.CodeChild, c.ChildName
    FROM Child c
    JOIN Junction j ON c.CodeChild = j.CodeChild
    GROUP BY c.CodeChild, c.ChildName
    HAVING COUNT(DISTINCT j.CodeMother) = (SELECT COUNT(DISTINCT CodeMother) FROM Mother);
    
    这里用COUNT(DISTINCT j.CodeMother)是为了避免中间表存在重复关联记录的情况,如果你的Junction表保证每个(CodeMother, CodeChild)组合唯一,也可以简化为COUNT(*) = (...)。

问题2:指定至少2个母亲,查询她们共有的子项

你给出的Select CodeChild From Junction Where CodeMother in ('02','03')语句有个明显的问题:它会返回母亲02或03关联的所有子项,包括只属于其中一个母亲的子项,这不是你要的“共有”结果。

预期结果

假设你的Junction表数据如下:

CodeMotherCodeChild
0253
0210
0353
0315

那么正确的预期结果应该只有53(因为它是02和03都关联的子项),而你的原语句会返回53,10,53,15(去重后是53,10,15),完全不符合需求。

实现方法

我们需要通过分组统计,筛选出在指定母亲列表中出现次数等于母亲数量的子项:

SELECT j.CodeChild, c.ChildName
FROM Junction j
JOIN Child c ON j.CodeChild = c.CodeChild
WHERE j.CodeMother IN ('02','03')
GROUP BY j.CodeChild, c.ChildName
HAVING COUNT(DISTINCT j.CodeMother) = 2; -- 2是你指定的母亲数量

同样,如果Junction表没有重复关联记录,COUNT(DISTINCT ...)可以换成COUNT(*)。另外,如果你想动态适配任意数量的母亲(比如3个),只需要把IN里的列表和HAVING后的数字对应调整即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:44:45