如何用SQL查询Pizza表中未存在的Size与Topping所有组合
获取未在Pizza表中出现的Size与Topping组合
要实现这个需求,核心是先生成Size和Topping的所有可能组合,再排除已经在Pizza表中存在的组合。下面提供两种通用的SQL实现方式,适配大多数关系型数据库:
方法1:CROSS JOIN + LEFT JOIN 筛选
先通过CROSS JOIN生成Size和Topping的笛卡尔积(所有组合),再通过LEFT JOIN关联Pizza表,筛选出未匹配到的记录:
SELECT s.Id AS SizeId, s.Name AS SizeName, t.Id AS ToppingId, t.Name AS ToppingName FROM Size s CROSS JOIN Topping t LEFT JOIN Pizza p ON s.Id = p.SizeId AND t.Id = p.ToppingId WHERE p.Id IS NULL;
方法2:NOT EXISTS 子查询
通过NOT EXISTS直接判断当前Size和Topping的组合是否不存在于Pizza表中:
SELECT s.Id AS SizeId, s.Name AS SizeName, t.Id AS ToppingId, t.Name AS ToppingName FROM Size s CROSS JOIN Topping t WHERE NOT EXISTS ( SELECT 1 FROM Pizza p WHERE p.SizeId = s.Id AND p.ToppingId = t.Id );
针对示例数据的输出结果
结合你给出的示例数据,执行上述SQL后会得到以下4种未存在的组合:
- SizeId:1 (Medium) + ToppingId:1 (Pepperoni)
- SizeId:1 (Medium) + ToppingId:2 (Ham)
- SizeId:2 (Large) + ToppingId:2 (Ham)
- SizeId:3 (X-Large) + ToppingId:1 (Pepperoni)
内容的提问来源于stack exchange,提问作者Sebastián Rubina
相关产品推荐
相关产品推荐

