You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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;

用你的示例数据,这个查询会返回:

SourceTableidDiffColumn1DiffValue1DiffColumn2DiffValue2DiffColumn3DiffValue3
TABLE A1txt1XYNULLNULLtxt3XXY

方案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);

用你的示例数据,这个查询会返回:

SourceTableidDiffColumnDiffValue
TABLE A1txt1XY
TABLE A1txt3XXY

补充说明:处理NULL值

上面的方案2已经考虑了NULL的情况——因为SQL中NULL <> 任何值都会返回UNKNOWN,不会被WHERE过滤,所以我们额外加了两个条件来覆盖“表A列是NULL但表B不是”或者“表A列不是NULL但表B是”的场景。

内容的提问来源于stack exchange,提问作者mmprogram

火山引擎 最新活动