Sql 识别特定键列的特定行中列的差异

Sql 识别特定键列的特定行中列的差异,sql,sql-server,Sql,Sql Server,我在SQL Server中有两个表,table1和table2。两者具有相同的架构和相同的行数。我试图找出特定行的任何列值是否存在任何差异 除了之外,我还使用了来查找差异,但是有数百万行,因此尝试进行自定义 代码: 但是上面的代码没有返回正确的结果 CREATE TABLE T1 ( KEYCOL VARCHAR(60), COL2 CHAR(20), COL3 INT, COL4 VARCHAR(30) ) INSERT INTO T1 SELECT

我在SQL Server中有两个表,
table1
table2
。两者具有相同的架构和相同的行数。我试图找出特定行的任何列值是否存在任何差异

除了之外,我还使用了
来查找差异,但是有数百万行,因此尝试进行自定义

代码:

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

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

请分享您的想法。

您可以创建一个包含主键和表中所有列哈希的表。 这里有几个样本:
将两个源表中的键和哈希插入哈希表

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

SELECT PrimaryKey,Hash
FROM HashTable 
GROUP BY PrimaryKey,Hash
HAVING COUNT(1) = 1
此查询将标识不同的行。
哈希冲突的可能性总是存在的,但概率很低,您可能会忽略它。

您可以创建一个表,其中包含主键和表中所有列的哈希。 这里有几个样本:
将两个源表中的键和哈希插入哈希表

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

SELECT PrimaryKey,Hash
FROM HashTable 
GROUP BY PrimaryKey,Hash
HAVING COUNT(1) = 1
此查询将标识不同的行。
哈希冲突的可能性总是存在的,但概率很低,您可能会忽略它。

您可以使用
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;
选择t1.keycol,
stuff((当t1.col2 t2.col2 then'在col2'else'中更改'end'时的情况)+
(t1.col3 t2.col3 then',col3中的更改'else'结束时的情况)+
(当t1.col4 t2.col4 then'更改为col4'else'结束时的情况)
1, 2, '')
从t1连接
t2
在t1.keycol=t2.keycol;

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

您可以使用
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;
选择t1.keycol,
stuff((当t1.col2 t2.col2 then'在col2'else'中更改'end'时的情况)+
(t1.col3 t2.col3 then',col3中的更改'else'结束时的情况)+
(当t1.col4 t2.col4 then'更改为col4'else'结束时的情况)
1, 2, '')
从t1连接
t2
在t1.keycol=t2.keycol;

当列都相同而不是
'NO CHANGE'

时,此版本生成
'
,您的问题是什么?你的问题在哪里?你的问题是什么?你的问题在哪里Except@TULSI . . . 所以写25个以上的表达式。@TULSI。所以写25个以上的表达式。