mssql 比较两个表并且只比较 return 不相同的列
mssql compare two tables and only return non identical columns
我想知道 'table1' 和 'table2' 两个表是否相同。
我知道我可以比较 'where' 子句中两个表的每一列
所以这基本上会向我显示相同的每一行。
但我想知道哪些列是相同的。所以我认为只需转换表格并如前所述比较结果就很容易了。表中的列名和顺序与已经给出的相同。
我还制作了一个示例输入和输出场景:
--------输入--------------
表 1
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
或结果
table1.col2
table2.col2
23
20
21
0
22
22
12
30
23
23
25
或类似的......
不相同的列的值无关紧要我只需要列名,但我不在乎值是否会随之而来。希望不会太难
考虑到您真的只想接收相同的列,您可能想尝试使用 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
我想知道 'table1' 和 'table2' 两个表是否相同。 我知道我可以比较 'where' 子句中两个表的每一列 所以这基本上会向我显示相同的每一行。
但我想知道哪些列是相同的。所以我认为只需转换表格并如前所述比较结果就很容易了。表中的列名和顺序与已经给出的相同。 我还制作了一个示例输入和输出场景:
--------输入-------------- 表 1
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 |
---|
或结果
table1.col2 | table2.col2 |
---|---|
23 | 20 |
21 | 0 |
22 | 22 |
12 | 30 |
23 | 23 |
25 |
或类似的...... 不相同的列的值无关紧要我只需要列名,但我不在乎值是否会随之而来。希望不会太难
考虑到您真的只想接收相同的列,您可能想尝试使用 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