我有表A.这个表没有任何PK,它只存储很多行,只能通过组合列值来识别。
存在从表A和其他表中获取数据的过程,进行适当的匹配/处理和馈送表B.
现在,如何检查表A中的数据是否正确插入表B?
它是sql server 2000所以EXCEPT不是解决方案。
也许某些程序包括:
更新: 提供表B的过程不会将表A中的所有行放入表C.此外,它还从其他表中获取数据(让我们称之为C)并将其放入B(但也不是所有行)。我认为可能使用一个游标来检查B来自A的数据,然后使用其他游标来检查B来自C的数据将是一个很好的解决方案。
答案 0 :(得分:0)
您可以根据您的条件为没有匹配的行执行NOT EXISTS
SELECT Columns
FROM TableA
Where NOT EXISTS
(
SELECT 1
FROM TableB
WHERE 1=1
AND TableA.Column1 = TableB.Column1
AND TableA.Column2 = TableB.Column2
AND TableA.Column3 = TableB.Column3
AND TableA.Column4 = TableB.Column4
)
您可以根据您的条件查询匹配但没有其余数据匹配的行
SELECT Columns
FROM TableA
INNER JOIN TableB
ON TableA.Column1 = TableB.Column1
AND TableA.Column2 = TableB.Column2
AND TableA.Column3 = TableB.Column3
AND TableA.Column4 = TableB.Column4
)
WHERE TableA.Column11 <> TableB.Column11
OR TableA.Column12 <> TableB.Column12
OR TableA.Column13 <> TableB.Column13
OR TableA.Column14 <> TableB.Column14
现在您有两组断开连接的记录,您可以应用必要的逻辑。
这里的大多数人都会给你基于SET的答案而不是基于CURSOR的答案。你会在StackOverflow上找到很多关于为什么不使用CURSOR的材料。
答案 1 :(得分:0)
为什么需要光标?
SELECT COUNT(*) --or simply the list of columns
FROM A LEFT JOIN B
ON A.col1 = B.col1
AND A.col2 = B.Col2
AND ....
WHERE A.col1 IS NULL AND A.col2 IS NULL
如果存在多个列可能为NULL的可能性,您可能需要在WHERE子句中指定多个列以检查NULL。
这可能不是很快,因此根据您的索引结构,您可能需要先进行计数以检查并查看是否有任何不匹配的行,然后搜索行。