Sql 验证一个表中的行与另一个表中的行是否匹配

Sql 验证一个表中的行与另一个表中的行是否匹配,sql,sql-server,Sql,Sql Server,我现在正在从事一个归档项目,该项目涉及将数据从一个数据库中的表移动到归档数据库中的表。过程如下: 查找要存档的记录 验证它是否尚未存档 把数据复制过来 验证是否已复制所有数据 从源中删除数据 我正在寻找如何执行步骤4。我希望确保存档表中给定行中列中的每个值与生产表中给定行中列中的每个值完全相同。我只想这样做,这样我就知道从生产表中删除数据是安全的。我正在处理的两个表都有相同的列。现在,我只是在删除归档文件之前检查生产中的行的Id是否存在。我知道我可以做得更好,但我不是一个真正的SQL专家。在我目

我现在正在从事一个归档项目,该项目涉及将数据从一个数据库中的表移动到归档数据库中的表。过程如下:

查找要存档的记录 验证它是否尚未存档 把数据复制过来 验证是否已复制所有数据 从源中删除数据 我正在寻找如何执行步骤4。我希望确保存档表中给定行中列中的每个值与生产表中给定行中列中的每个值完全相同。我只想这样做,这样我就知道从生产表中删除数据是安全的。我正在处理的两个表都有相同的列。现在,我只是在删除归档文件之前检查生产中的行的Id是否存在。我知道我可以做得更好,但我不是一个真正的SQL专家。在我目前的知识范围内,我能想到的解决方案将是漫长而痛苦的,因此我想知道是否有一种快速的、单一的查询方法来实现这一点

这是伪代码,我将我的C与此混合,但我需要类似的东西:

(SELECT * FROM [Production].[dbo].[Table1] WHERE Id = '1234') == (SELECT * FROM [Archive].[dbo].[Table1] WHERE Id = '1234')

是的,我很清楚这不是正确的语法

如果运行以下查询,则可以手动进行比较

SELECT * FROM [Production].[dbo].[Table1] pt
FULL OUTER JOIN [Archive].[dbo].[Table1] at ON pt.id=at.id
取决于你有哪些领域你可以做

SELECT * FROM [Production].[dbo].[Table1] pt
FULL OUTER JOIN [Archive].[dbo].[Table1] at ON pt.id=at.id
WHERE pt.Column1 <> at.Column1 OR pt.Column2 <> at.Column2..etc
要仅获取差异,请尝试以下操作:

样本数据:

DECLARE @Archive AS TABLE (id varchar(1), other varchar(1), another varchar(2), yetanother varchar(2))
DECLARE @Production AS TABLE (id varchar(1), other varchar(1), another varchar(2))

INSERT INTO @Production  VALUES('1','1','11')
INSERT INTO @Production  VALUES('2','2','22')
INSERT INTO @Archive VALUES('1','1','11','11')
INSERT INTO @Archive VALUES('3','3','33','33')
查询:

DECLARE @id INT = 1

SELECT COUNT(*)
FROM
(SELECT id, other, another FROM @Production WHERE Id = @id
EXCEPT
SELECT id, other, another FROM @Archive WHERE Id = @id) AS x
0表示不匹配

使用您的确切示例,您可以:

SELECT COUNT(*)
FROM
(SELECT id, col1, col2, etc... FROM [Production].[dbo].[Table1] WHERE Id = '1234'
EXCEPT
SELECT id, col1, col2, etc... FROM [Archive].[dbo].[Table1] WHERE Id = '1234') AS x

有关除此之外的更多信息

如果不存在,请从存档中选择*,其中[…]除从生产中选择*,其中[…]验证生产中存在所有存档行检查另一侧作为练习。您描述的所有步骤可能都应该以更基于集合的方式完成,可能使用MERGE。在我的场景中,两个表中肯定不会有相同的数字。除非从第一个表中获取所有行,并从第二个表中删除所有匹配的行。如果仍有行,则存档包含不在生产中的行。这可能是意料之中的,因为归档文件包含较旧的内容,但这就是WHERE的用途。诚然,您可能想换一种方式,生产中是否有不在存档中的行?还有INTERSECT和UNION-SQL有完整的集合运算符。一个精确的1对1关系从来都不是必需的,即使对于联接也是如此,事实上,如果需要的话,您需要检查它。@user1059903您能告诉我们一些关于您的表的更多信息吗?我注意到您在查询中筛选ID;ID对记录是唯一的吗?@EdwardRusu是的,ID对记录是唯一的,但在表之间不是唯一的。我的想法是,它们是完全匹配的。这在某种意义上是有效的,是的,但如果我可以避免的话,我不会寻找手动过程。如果有可能只得到一个是或否/对或错的答案,那将是最好的。这不会起作用,因为生产中的行数与存档不匹配。我只是想看看生产中的一条给定记录是否与存档中的一条给定记录匹配。这只是检查每个表中的一条记录,我从示例数据中移动了变量以使其更为明显。我在运行时得到了这样的结果:所有查询都使用一个并集进行组合,INTERSECT或EXCEPT运算符在其目标列表中的表达式数必须相等。您需要指定哪些列,而不是SELECT*它们必须具有不同的列数。我会更新答案的。啊,好的,明白了。这最终会比我想做的工作多得多,但这可能是唯一可行的方法。顺便说一句,我想你应该使用INTERSECT而不是Exception。我希望它们确实匹配,这样我就可以安全地删除其中一个。在那个例子中,当选择两个Id匹配的列时使用INTERSECT给我一个1。然后,我更改了其中一个select语句的Id,因为我完全知道它们不匹配,所以它给了我一个0。