SQL Server中如何对比不同表行数据并返回A表差异值?
对比SQL Server两表指定列差异并返回表A的差异值
没问题,我来帮你搞定这个需求——通过ID关联表A和表B,找出指定列中表A与表B不一致的值,并返回表A的对应内容。下面分两种场景给出解决方案,你可以根据实际需求选择:
方案1:按列展示所有差异(适合查看单条记录的多列差异)
这种方式会把同一ID下所有有差异的列都展示在一行里,直观看到该记录哪些列不同:
SELECT 'TABLE A' AS SourceTable, a.id, -- 仅当列值不同时才显示列名和表A的值 CASE WHEN a.txt1 <> b.txt1 THEN 'txt1' END AS DiffColumn1, CASE WHEN a.txt1 <> b.txt1 THEN a.txt1 END AS DiffValue1, CASE WHEN a.txt2 <> b.txt2 THEN 'txt2' END AS DiffColumn2, CASE WHEN a.txt2 <> b.txt2 THEN a.txt2 END AS DiffValue2, CASE WHEN a.txt3 <> b.txt3 THEN 'txt3' END AS DiffColumn3, CASE WHEN a.txt3 <> b.txt3 THEN a.txt3 END AS DiffValue3 FROM TableA a INNER JOIN TableB b ON a.id = b.id -- 过滤出至少有一列差异的记录 WHERE a.txt1 <> b.txt1 OR a.txt2 <> b.txt2 OR a.txt3 <> b.txt3;
用你的示例数据,这个查询会返回:
| SourceTable | id | DiffColumn1 | DiffValue1 | DiffColumn2 | DiffValue2 | DiffColumn3 | DiffValue3 |
|---|---|---|---|---|---|---|---|
| TABLE A | 1 | txt1 | XY | NULL | NULL | txt3 | XXY |
方案2:按行展示每个差异(适合批量查看所有差异项)
如果想把每个差异列单独作为一行展示,结果会更规整,方便后续处理或统计:
SELECT 'TABLE A' AS SourceTable, a.id, c.DiffColumn, c.DiffValue FROM TableA a INNER JOIN TableB b ON a.id = b.id -- 用CROSS APPLY把列转成多行,逐列对比 CROSS APPLY ( VALUES ('txt1', a.txt1, b.txt1), ('txt2', a.txt2, b.txt2), ('txt3', a.txt3, b.txt3) ) c (DiffColumn, DiffValue, BValue) -- 过滤出值不同的行,同时处理NULL的情况 WHERE c.DiffValue <> c.BValue OR (c.DiffValue IS NULL AND c.BValue IS NOT NULL) OR (c.DiffValue IS NOT NULL AND c.BValue IS NULL);
用你的示例数据,这个查询会返回:
| SourceTable | id | DiffColumn | DiffValue |
|---|---|---|---|
| TABLE A | 1 | txt1 | XY |
| TABLE A | 1 | txt3 | XXY |
补充说明:处理NULL值
上面的方案2已经考虑了NULL的情况——因为SQL中NULL <> 任何值都会返回UNKNOWN,不会被WHERE过滤,所以我们额外加了两个条件来覆盖“表A列是NULL但表B不是”或者“表A列不是NULL但表B是”的场景。
内容的提问来源于stack exchange,提问作者mmprogram




