不同表上的mssql校验和

时间:2016-02-12 13:49:22

标签: sql-server

我需要查找两行(其中一行具有相同的id +50000)是否相同。有没有办法让这个查询有效?

select 1 
from table1 c1, 
     table2 c2 
where c1.id=c2.id+50000 and CHECKSUM(c1.*) = CHECKSUM(c2.*)

CHECKSUM()显然不接受"table.*"表达式。它单独接受"*"或列列表,但我不能这样做,因为此查询也需要对其他列的其他列也有效。

编辑:我刚刚意识到CHECKSUM()无效,因为如果ID不同,价值总会不同......

最初的问题仍然是出于好奇。

2 个答案:

答案 0 :(得分:1)

尝试这样的东西,它适用于大多数数据类型(不是TEXT和其他一些):

SELECT 1 
FROM
  table1 c1
JOIN 
  table2 c2 
ON 
  c1.id=c2.id+50000 and
  EXISTS(SELECT c1.col1, col2, col3, col4 EXCEPT SELECT c2.col1, col2, col3, col4)

答案 1 :(得分:1)

您可以使用派生表来执行此操作:

    SELECT 
            SUM(CASE
                WHEN a.cs <> b.cs THEN 1
                ELSE 0
            END)
        FROM (SELECT RowNumber, CHECKSUM(*) AS cs FROM #A) a
        FULL OUTER JOIN (SELECT RowNumber, CHECKSUM(*) AS cs FROM #B) b
            ON a.RowNumber=b.RowNumber;

这是我之前写过的剧本的摘录。我没有更改任何对象名称以匹配您的示例。此查询的结果是#A和#B之间的差异数,其中RowNumber列匹配。

要应用您的需要,您可以创建两个临时表,从原始文件中填充它们,但将ID列替换为您要匹配的行之间匹配的“RowNumber”列(即:c1.id = c2 .ID + 50000)。这样,您就没有错误匹配的ID来干扰CHECKSUM。