如何用SQL关联Table X与Table Y,对比Item Code和QTY数据?
解决方案:对比两表Item数量并补全缺失值
当然可以实现这个需求!这是个非常典型的跨表数据比对场景,我们可以通过SQL的全连接配合函数来完美达成你想要的结果,下面分数据库场景给出具体实现:
支持FULL OUTER JOIN的数据库(如SQL Server、PostgreSQL、Oracle等)
直接用全连接合并两个表的所有Item,再用COALESCE()把空值替换为0:
SELECT COALESCE(x.[Item Code], y.[Item Code]) AS [Item Code], COALESCE(x.QTY, 0) AS [TABLE X QTY], COALESCE(y.QTY, 0) AS [Table Y QTY] FROM TableX x FULL OUTER JOIN TableY y ON x.[Item Code] = y.[Item Code] ORDER BY [Item Code];
代码说明:
FULL OUTER JOIN:会保留两个表中所有的Item Code记录,不管对方表是否存在该ItemCOALESCE(a, b):返回参数列表里第一个非空值,这里用来把某表中无对应Item时的NULLQTY替换成0- 最后用
ORDER BY让结果按Item Code排序,和你给出的示例格式完全匹配
不支持FULL OUTER JOIN的数据库(如MySQL)
如果你的数据库不支持全连接,可以用UNION ALL先合并两表数据,再通过分组和条件聚合实现:
SELECT [Item Code], SUM(CASE WHEN source = 'X' THEN QTY ELSE 0 END) AS [TABLE X QTY], SUM(CASE WHEN source = 'Y' THEN QTY ELSE 0 END) AS [Table Y QTY] FROM ( -- 给两表数据加上来源标识后合并 SELECT [Item Code], QTY, 'X' AS source FROM TableX UNION ALL SELECT [Item Code], QTY, 'Y' AS source FROM TableY ) AS combined_data GROUP BY [Item Code] ORDER BY [Item Code];
代码说明:
- 子查询用
UNION ALL合并两表,并给每条数据标记来源是X还是Y - 外层通过
GROUP BY [Item Code]聚合,用CASE WHEN分别统计来自X和Y的QTY,不存在的Item自然会统计出0
用以上两种方法中的任意一种,都能得到你期望的对比结果。
内容的提问来源于stack exchange,提问作者James Smith
相关产品推荐
相关产品推荐

