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

时间:2017-03-14 15:25:32

标签: sql sql-server

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

  1. 查找要存档的记录
  2. 确认它尚未归档
  3. 通过
  4. 复制数据
  5. 验证所有数据是否已通过
  6. 复制
  7. 从源
  8. 删除数据

    我正在寻找如何执行第4步。我想确保归档表中给定行的列中的每个值与给定行中的每列中的每个值完全相同我的生产表。我只想这样做,所以我知道从生产表中删除数据是安全的。我使用的表格具有相同的列。现在,我只是在删除之前检查存档中是否存在生产行的Id。我知道我可以做得更好,但我不是真正的SQL专家。我能想到的解决方案属于我目前的知识范围,这将是漫长而痛苦的,所以我看看是否有一种快速的,一种查询方式。

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

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

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

2 个答案:

答案 0 :(得分:1)

试试这个:

示例数据:

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

有关除here

之外的更多信息

答案 1 :(得分:0)

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

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

仅获得差异