如何找出未拥有全部颜色的车辆?SQL查询问题求助
解决方法:找出未包含所有颜色的车辆
嘿,我来帮你搞定这个问题!你要找的是tableCars里那些没覆盖tableColors所有颜色的车型(也就是AUDI),我给你两种简单有效的SQL写法,比你之前试的左连接/ NOT EXISTS更精准:
方法1:统计颜色数量对比
这个思路很直接:先算出tableColors里总共有多少种颜色,再统计每款车拥有的颜色数量,只要某款车的颜色数小于总颜色数,就说明它缺了至少一种颜色。
SELECT car FROM tableCars GROUP BY car HAVING COUNT(DISTINCT color) < (SELECT COUNT(DISTINCT color) FROM tableColors);
解释:
SELECT COUNT(DISTINCT color) FROM tableColors会返回总颜色数(这里是3:blue、red、white)- 对
tableCars按car分组后,COUNT(DISTINCT color)统计每款车的独特颜色数 HAVING子句筛选出颜色数少于总数的车型,结果就是AUDI
方法2:生成全量组合找缺失
另一种思路是先生成「所有车型+所有颜色」的全量组合,再找出哪些组合在tableCars里不存在,对应的车型就是我们要找的:
SELECT DISTINCT c.car FROM (SELECT DISTINCT car FROM tableCars) c CROSS JOIN tableColors tc LEFT JOIN tableCars tc2 ON c.car = tc2.car AND tc.color = tc2.color WHERE tc2.car IS NULL;
解释:
(SELECT DISTINCT car FROM tableCars)先拿到所有唯一的车型(Mercedes、BMW、AUDI)CROSS JOIN tableColors生成每个车型和所有颜色的组合(比如AUDI+blue、AUDI+red等)- 左连接
tableCars,如果某个组合在原表中不存在(tc2.car IS NULL),说明这款车缺这个颜色 - 最后
DISTINCT去重,得到所有缺颜色的车型
这两种方法都能精准得到你要的结果,第一种更简洁高效,适合数据量不大的场景;第二种逻辑更直观,能清晰看到每款车缺了哪些颜色(如果需要的话,去掉DISTINCT就能看到缺失的具体组合)。
内容的提问来源于stack exchange,提问作者EricH
相关产品推荐
相关产品推荐

