SQL Server两表获取全ID组合(无匹配也返回)的优化方案咨询
优化方案
你现有的实现逻辑是正确的,但存在冗余开销,可以进一步简化,性能更好:
现有方案的冗余点
你在CTE中做的GROUP BY完全没有必要:Companies的CompanyId是主键、Motors的MotorId也是主键,两者交叉连接生成的(CompanyId, MotorId)组合天然唯一,额外的聚合操作只会增加不必要的性能损耗。同时多层关联也增加了执行计划的复杂度。
更优的实现代码
SELECT c.CompanyId, m.MotorId, c.Tot1, c.Tot2, ms.TotSales1, ms.TotSales2 FROM Companies c -- 生成所有Company和Motor的组合 CROSS JOIN Motors m -- 左连接匹配对应公司+对应电机的销售数据 LEFT JOIN Motors ms ON c.CompanyId = ms.CompanyId AND m.MotorId = ms.MotorId -- 如果需要固定排序可以保留,不需要可以删除 ORDER BY c.CompanyId, m.MotorId
方案优势
- 性能更高:去掉了冗余的CTE、GROUP BY操作,仅需要2次表关联,比原有方案少1次关联,数据量越大性能优势越明显
- 完全符合你的业务要求:字段顺序和你要求的完全一致,不需要调整即可直接和C#类做字段映射,没有匹配的销售数据自动返回NULL,和你给出的示例结果完全一致
内容的提问来源于stack exchange,提问作者Emanuele Lacopo
相关产品推荐
相关产品推荐

