我需要查找两行(其中一行具有相同的id +50000)是否相同。有没有办法让这个查询有效?
select 1
from table1 c1,
table2 c2
where c1.id=c2.id+50000 and CHECKSUM(c1.*) = CHECKSUM(c2.*)
CHECKSUM()
显然不接受"table.*"
表达式。它单独接受"*"
或列列表,但我不能这样做,因为此查询也需要对其他列的其他列也有效。
CHECKSUM()
无效,因为如果ID不同,价值总会不同......
最初的问题仍然是出于好奇。
答案 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。