SQL Server双表查询优化:获取所有关联图片IsDefault均为0的产品
优化实现方案
方案1:GROUP BY聚合查询(推荐,逻辑简洁,扫描次数少)
这种写法仅需扫描一次ProductImage表,通过分组聚合判断分组内是否存在IsDefault=1的记录,无需嵌套子查询,可读性和性能表现都更优:
SELECT pd.ProductId FROM Product pd INNER JOIN ProductImage img ON pd.ProductId = img.ProductId GROUP BY pd.ProductId HAVING MAX(CAST(img.IsDefault AS INT)) = 0
说明:如果
IsDefault本身就是INT类型,可以去掉CAST转换直接取最大值。只要分组内存在任意一张默认图,最大值就会是1,筛选等于0的结果就完全符合需求,也不需要额外加DISTINCT去重,GROUP BY天然实现了去重逻辑。
方案2:LEFT JOIN反匹配查询
这种写法等价于你原有的NOT EXISTS逻辑,大多数场景下SQL Server查询优化器会生成和NOT EXISTS完全一致的执行计划:
SELECT DISTINCT pd.ProductId FROM Product pd INNER JOIN ProductImage img ON pd.ProductId = img.ProductId LEFT JOIN ProductImage defaultImg ON defaultImg.ProductId = pd.ProductId AND defaultImg.IsDefault = 1 WHERE defaultImg.ProductId IS NULL
性能优化建议
给ProductImage表建立(ProductId, IsDefault)的联合非聚集索引,上述所有查询的性能都会大幅提升,避免全表扫描。
内容的提问来源于stack exchange,提问作者Allah Ditta
相关产品推荐
相关产品推荐

