SQL多对多多行Join查询:查询完全适配属性组的汽车
解决思路
核心判断逻辑是:某款汽车的全部属性,都被对应属性组的属性集合完整覆盖。
处理时优先对原始表去重,避免汽车的重复属性记录干扰统计结果。
实现SQL
SELECT DISTINCT c.name, pg.`group` -- 先对car表去重,消除重复记录影响 FROM (SELECT DISTINCT name, property FROM car) c -- 关联属性组表拿到所有候选组合 CROSS JOIN (SELECT DISTINCT `group`, property FROM property_group) pg GROUP BY c.name, pg.`group` -- 过滤不存在属性不匹配的组合 HAVING SUM(CASE WHEN c.property NOT IN ( SELECT property FROM property_group WHERE `group` = pg.`group` ) THEN 1 ELSE 0 END) = 0
逻辑说明
- 内层子查询先对
car和property_group表的业务字段去重,就算原始表存在重复数据也不会影响最终统计 CROSS JOIN生成所有汽车和属性组的待校验组合HAVING条件统计每一组中汽车属性不在属性组内的数量,数量为0就代表汽车所有属性都适配当前属性组- 外层加
DISTINCT避免出现重复的(汽车名称,属性组)结果
内容的提问来源于stack exchange,提问作者tvmaster
相关产品推荐
相关产品推荐

