SQL跨表含NULL列对比:查询成品对应全部组件的当前及采购历史成本
问题原因
你当前使用的默认JOIN属于内连接,仅会保留三张表中ComponentID完全匹配的行,而自制件不存在于仅存储外购件数据的vdvPurchased表中,匹配失败就会被过滤,因此查询结果没有自制件数据。
修复方案
把和vdvPurchased表的内连接改为左连接(LEFT JOIN)即可保留所有成品关联的组件行,自制件没有对应采购记录时,[Purchased Cost]字段会返回空值,符合预期展示效果。
修改后的查询语句
SELECT DISTINCT vdvFinishedGood.StepID AS [Step], vdvFinishedGood.ComponentID AS [Component], vdvInventory.LastUnitCost AS [Current Cost], vdvPurchased.Cost AS [Purchased Cost] FROM vdvFinishedGood JOIN vdvInventory ON vdvInventory.ComponentID = vdvFinishedGood.ComponentID LEFT JOIN vdvPurchased ON vdvPurchased.ComponentID = vdvFinishedGood.ComponentID WHERE vdvFinishedGood.ItemId = 'YOYO'
额外优化建议
如果同一个外购件在vdvPurchased表中有多条近3个月的采购记录,DISTINCT会返回多条同组件不同采购价的行,你可以根据需求调整:
- 要取最新采购价:可以加排序逻辑或者用
MAX(采购日期)做聚合 - 要取平均采购价:可以用
AVG(vdvPurchased.Cost)做聚合,同时补充GROUP BY分组字段
内容的提问来源于stack exchange,提问作者MyOwnIssues
相关产品推荐
相关产品推荐

