从t-sql(sql server2000)中的另一个表中的一个表中搜索数据?

时间:2009-10-07 10:22:09

标签: sql-server tsql sql-server-2000

我有表A.这个表没有任何PK,它只存储很多行,只能通过组合列值来识别。 存在从表A和其他表中获取数据的过程,进行适当的匹配/处理和馈送表B. 现在,如何检查表A中的数据是否正确插入表B?
它是sql server 2000所以EXCEPT不是解决方案。

也许某些程序包括:

  1. 游标将从中获取行 表A,
  2. 选择B(适当的 列匹配)
  3. 然后如果匹配的行已经 找到(选择返回一些数据) 增加计数器(正确的数量) 传播的行)
  4. 如果找不到匹配的行 我们正在寻找的数据 临时表(供以后审查)
  5. 更新: 提供表B的过程不会将表A中的所有行放入表C.此外,它还从其他表中获取数据(让我们称之为C)并将其放入B(但也不是所有行)。我认为可能使用一个游标来检查B来自A的数据,然后使用其他游标来检查B来自C的数据将是一个很好的解决方案。

2 个答案:

答案 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。

这可能不是很快,因此根据您的索引结构,您可能需要先进行计数以检查并查看是否有任何不匹配的行,然后搜索行。