2017-03-14 44 views
0

我正在处理归档项目,这涉及将数据从一个数据库中的表移出到归档数据库中的表。该过程如下:验证一个表中的行与另一个表中的行匹配

  1. 找到您要存档
  2. 验证它是不是已经归档
  3. 拷贝过来
  4. 数据确认所有数据被复制
  5. 记录删除来自数据源

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

这是伪代码,我混我的C#这一点,但我需要的东西,如:

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

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

+1

'IF NOT EXISTS(SELECT * FROM存档,[...] EXCEPT SELECT * FROM生产WHERE [。 ..])'验证'Production'中是否存在所有'Archive'行(检查另一边是否为练习)。很可能你所描述的所有步骤都应该以更多的基于集合的方式完成,可能使用'MERGE'。 –

+0

EXCEPT的问题是(我认为)两个表都需要相同数量的行。在我的情况下,绝对不会有同样的数字。 – user1059903

+0

'EXCEPT'从第一个表中取出所有行,并删除第二个表中匹配的所有行。如果有任何遗留,则“存档”包含不在“生产”中的行。 (这可能是预料之中的,因为'Archive'包含了更老的东西,但这就是'WHERE'的意思。)不可否认,你可能需要另一种方式(“Production”中有没有不在'Archive'中的行?“)还有'INTERSECT'和'UNION' - SQL有一整套的操作符。一个确切的1对1关系从不需要(即使对于'JOIN')也是如此,事实上,如果需要的话,你需要检查它。 –

回答

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

+0

这不起作用,因为生产中的行数与存档不匹配。我只是想看看生产中的单个给定记录是否与存档中的单个给定记录匹配。 – user1059903

+0

这只是检查每个表中的一条记录,我已经从样本数据中移动了这个变量,以使其更加明显。 – Mack

+0

我在运行时遇到这个问题: 所有使用UNION,INTERSECT或EXCEPT运算符组合的查询在其目标列表中必须具有相同数量的表达式。 – user1059903

-1

除了使用==,同比INNER JOIN条款很好地写着:

SELECT * FROM [Production].[dbo].[Table1] pt 
    INNER JOIN [Archive].[dbo].[Table1] at ON pt.id=at.id 
    WHERE pt.Id = '1234' 
+1

这并不回答问题atall .....首先,行可能会从一侧丢失,这将不会检测 – Milney

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 

要获得唯一的区别

+0

从某种意义上说,是的,但我不寻找一个“手动“过程,如果我能避免它。如果可能只是得到是或否或真或假的答案,那将是最好的。 – user1059903

相关问题