确定特定键列在特定行中列的差异

时间:2019-05-16 17:11:18

标签: sql sql-server

我在SQL Server中有两个表,table1table2。两者具有相同的架构和相等的行数。我正在尝试查找特定行的任何列值是否存在任何差异。

我确实使用Except来发现差异,但是有数百万行,因此尝试进行自定义。

代码:

select * from T1
except
select * from T2

但是上面的代码没有返回正确的结果。

CREATE TABLE T1
(
    KEYCOL VARCHAR(60),
    COL2 CHAR(20),
    COL3 INT,
    COL4 VARCHAR(30)
)

INSERT INTO T1
    SELECT 1000004177   R09 1   909622  UNION ALL
    SELECT 1000004478   Q22 1   3659573 UNION ALL
    SELECT 1000008983   Q16 1   955987  UNION ALL
    SELECT 1000010178   XX1 1   3069968 UNION ALL
    SELECT 1000013347   R09 1   3679779 UNION ALL
    SELECT 1000014510   Q16 1   YYY23   UNION ALL
    SELECT 1000015230   R17 1   1000015230 UNION ALL    
    SELECT 1000016049   Q16 1   1000016049 UNION ALL    
    SELECT 1000016332   Q16 1   1000016332

CREATE TABLE T2
(
    KEYCOL VARCHAR(60),
    COL2 CHAR(20),
    COL3 INT,
    COL4 VARCHAR(30)
)

INSERT INTO T2
    SELECT 1000004177   R09 1   909622  UNION ALL
    SELECT 1000004478   Q22 1   3659573 UNION ALL
    SELECT 1000008983   Q16 1   955987  UNION ALL
    SELECT 1000010178   ZZZ 1   3069968 UNION ALL
    SELECT 1000013347   R09 1   3679779 UNION ALL
    SELECT 1000014510   Q16 1   ZZZ23   UNION ALL
    SELECT 1000015230   R17 1   1000015230 UNION ALL    
    SELECT 1000016049   Q16 1   1000016049 UNION ALL    
    SELECT 1000016332   Q16 1   1000016332

所需的输出:

1000004177  NO CHANGE
1000004478  NO CHANGE
1000008983  NO CHANGE
1000010178  CHANGE IN COL2
1000013347  NO CHANGE
1000014510  CHANGE IN COL4
1000015230  NO CHANGE
1000016049  NO CHANGE
1000016332  NO CHANGE

请您分享您的想法。

2 个答案:

答案 0 :(得分:0)

您可以使用主键和表中所有列的哈希值创建表。 此处没有几个样本: SQL way to get the MD5 or SHA1 of an entire row
将两个源表中的键和哈希插入到哈希表中。

创建此类表后,您可以运行:

SELECT PrimaryKey,Hash
FROM HashTable 
GROUP BY PrimaryKey,Hash
HAVING COUNT(1) = 1

此查询将标识不同的行。 始终存在哈希冲突的可能性,但是概率很低,您可能会忽略它。

答案 1 :(得分:0)

您可以使用join和一些条件逻辑。像这样:

select t1.keycol,
       stuff( (case when t1.col2 <> t2.col2 then ', CHANGE IN COL2' else '' end) +
              (case when t1.col3 <> t2.col3 then ', CHANGE IN COL3' else '' end) +
              (case when t1.col4 <> t2.col4 then ', CHANGE IN COL4' else '' end)
              1, 2, '')
from t1 join
     t2
     on t1.keycol = t2.keycol;

当列都相同而不是''时,此版本将产生'NO CHANGE'