You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MSSQL对比两张结构相同表并返回不一致列的方案咨询

同结构两张表差异列查询方案

适用前提

  • 两张表table1、table2列名、列顺序完全一致
  • 两表有可关联的唯一主键(示例中用id作为主键)

方案1:转置后对比(符合你提到的实现思路)

将两表分别行转列拆分为「主键+列名+列值」的结构,再关联对比即可直接筛选出有差异的列:

WITH 
-- 转置table1为key-value结构
t1_unpivot AS (
  SELECT id, 'col1' AS col_name, col1 AS col_val FROM table1
  UNION ALL
  SELECT id, 'col2' AS col_name, col2 AS col_val FROM table1
  UNION ALL
  SELECT id, 'col3' AS col_name, col3 AS col_val FROM table1
  -- 有更多列直接在这追加UNION ALL语句即可
),
-- 转置table2为key-value结构
t2_unpivot AS (
  SELECT id, 'col1' AS col_name, col1 AS col_val FROM table2
  UNION ALL
  SELECT id, 'col2' AS col_name, col2 AS col_val FROM table2
  UNION ALL
  SELECT id, 'col3' AS col_name, col3 AS col_val FROM table2
  -- 列数和table1保持一致
)
-- 去重后仅返回存在差异的列名
SELECT DISTINCT t1.col_name AS diff_column
FROM t1_unpivot t1
INNER JOIN t2_unpivot t2 
  ON t1.id = t2.id 
  AND t1.col_name = t2.col_name
WHERE t1.col_val IS DISTINCT FROM t2.col_val;

如果需要同时查看差异明细,把最后一段SELECT语句替换为以下内容即可:

SELECT 
  t1.id, 
  t1.col_name AS diff_column, 
  t1.col_val AS table1_value, 
  t2.col_val AS table2_value

语法适配说明

  • 如果你使用的数据库不支持IS DISTINCT FROM语法(用于兼容NULL值对比),可以把WHERE条件替换为:
    WHERE CASE 
      WHEN t1.col_val = t2.col_val OR (t1.col_val IS NULL AND t2.col_val IS NULL) 
      THEN 0 ELSE 1 END = 1
    
  • 列数较多的场景,可以借助数据库的元数据表自动生成转置的UNION ALL语句,不用手动逐列编写。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 11:06:04