我在SQL Server中有两个表,table1
和table2
。两者具有相同的架构和相等的行数。我正在尝试查找特定行的任何列值是否存在任何差异。
我确实使用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
请您分享您的想法。
答案 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'
。