首页 > 解决方案 > mssql比较两个表,只返回不相同的列

问题描述

我想知道两个表'table1'和'table2'是否相同。我知道我可以比较“where”子句中两个表的每一列所以这基本上会告诉我每一行都是相同的。

但我想知道的是哪些列是相同的。因此,我认为只转换表格并比较前面提到的结果会很容易。表中的列名和顺序与已经给出的相同。我还制作了一个示例输入和输出场景:

--------输入--------------- table1

ID col1 col2 col3
1 14 23 45
2 12 21 43
3 12 22 43
4 10 12 41
5 11 23 44
6 13 25 43

表2

ID col1 col2 col3
1 14 20 45
2 12 0 43
3 12 22 43
4 10 30 41
5 11 23 44
6 13 43

- - - - - 输出 - - - - - - - -

结果

col2
20
0
22
30
23

或结果

??? ??? ??? ??? ??? ??? ???
col2 20 0 22 30 23

或结果

col2

或结果

表 1.col2 表 2.col2
23 20
21 0
22 22
12 30
23 23
25

或类似..... 不同列的值无关紧要,我只需要列名,但我不在乎值是否会随之而来。我希望它不会太难。

标签: sql-serverdatatablescompare

解决方案


考虑到您真的只想接收相同的列,您可能想尝试使用 unpivot 的方法。举个例子:

DECLARE @t1 TABLE(
   id int
  ,col1 int
  ,col2 int
  ,col3 int
);

INSERT INTO @t1 VALUES
 (1,14,23,45)
,(2,12,21,43)
,(3,12,22,43)
,(4,10,12,41)
,(5,11,23,44)
,(6,13,25,43);

DECLARE @t2 TABLE(
   id int
  ,col1 int
  ,col2 int
  ,col3 int
);

INSERT INTO @t2 VALUES
 (1,14,20,45)
,(2,12,0,43)
,(3,12,22,43)
,(4,10,30,41)
,(5,11,23,44)
,(6,13,NULL,43);

WITH cte1 AS(
  SELECT id, col, val
    FROM (SELECT id, col1, col2, col3 FROM @t1) p
  UNPIVOT
    (val FOR col IN (col1, col2, col3)) as unpvt
),
cte2 AS(
  SELECT id, col, val
    FROM (SELECT id, col1, col2, col3 FROM @t2) p
  UNPIVOT
    (val FOR col IN (col1, col2, col3)) as unpvt
)
SELECT DISTINCT c1.id, c1.col, c1.val
  FROM cte1 c1
  INNER JOIN cte2 c2 ON c2.id = c1.id AND c2.col = c1.col AND c2.val = c1.val
  ORDER BY 1, 2

推荐阅读