【问题标题】:mssql compare two tables and only return non identical columnsmssql比较两个表,只返回不相同的列
【发布时间】:2021-10-07 09:13:04
【问题描述】:

我想知道两个表'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

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

【问题讨论】:

  • 结果集当然不能每行包含不同的列,您想要的结果仅包含您已经知道存在差异的列,那么如果 table1 的 col1 具有不同的值呢?
  • 请检查您的示例 - 它与描述的预期结果不符。您编写了“仅相同的列”,但您希望输出值为 20 的 Col2 - 它仅包含在第二个表中,并且此 Col2 在两个表中并不相同。
  • 我想知道每个值与另一列的每个值对应的列,这就是我所说的相同列。如果我知道不相同的,我当然也知道相同的,所以它是相同的,我不在乎它们中的哪一个。此外,无论有无值,列的显示方式也无关紧要。

标签: sql-server datatables compare


【解决方案1】:

考虑到您真的只想接收相同的列,您可能想尝试使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 2013-08-08
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多