Home > OS >  mssql compare two tables and only return non identical columns
mssql compare two tables and only return non identical columns

Time:10-08

I would like to know if two tables 'table1' and 'table2' are identical. I know I could compare every column of both tables in the 'where'-clause So this would basically show me every Row that is identical.

But what I want to know is which columns are identical. So I think it would be easy to just transpone the tables and compare the results as mentioned before. Column names and order in the tables are both identical as already given. I made also an example Input and Output scenario:

-------Input--------------- 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

table2

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

----------Output----------------

result

col2
20
0
22
30
23

OR result

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

OR result

col2

OR result

table1.col2 table2.col2
23 20
21 0
22 22
12 30
23 23
25

OR similar..... The values of the non identical columns dont matter I just need the column name, but I wouldnt care if values would come along with it. I hope its not too diffcult.

CodePudding user response:

Consifering you really want to receive only the identical columns, you might want to try an approach using unpivot. Following an example:

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
  • Related