【问题标题】:Searching for data from one table in another table in t-sql (sql server2000)?在t-sql(sql server2000)的另一个表中从一个表中搜索数据?
【发布时间】:2010-12-04 13:58:41
【问题描述】:

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

也许一些程序包括:

  1. 光标将从 表A,
  2. 在 B 上进行选择(使用适当的 列匹配)
  3. 然后如果匹配的行已经 找到(选择返回一些数据) 增加计数器(适当的数量 传播的行)
  4. 如果没有找到匹配的行放 我们正在寻找的数据 临时表(供以后查看)

更新: 为表 B 提供数据的过程不会将表 A 中的所有行都放入表 C 中。此外,它还从其他表(我们称之为 C)中获取数据并将其放入 B 中(但也不是所有行)。我认为也许使用一个游标检查 B 以获取来自 A 的数据,然后使用另一个游标检查 B 以获取来自 C 的数据将是一个很好的解决方案。

【问题讨论】:

  • 更新后:虽然我不排除在某些情况下需要使用游标,但这些情况很少见,这肯定不是其中之一。必须有一些标准可以让您知道为什么 A 中的行进入或没有进入 B。您可以修改以下任一答案来确定哪些行应该在 B 中但没有进入。
  • 为什么不在每张桌子上都有 PK?如果你有一个组合键,你至少应该有一个代理 PK 和一个定义记录的值组合的唯一索引。如果表 A 只是一个临时表,并且仅用于在移动到表 b 之前存储数据以进行清理,那么也许您可以在没有唯一索引的情况下逃脱(因为也许您还没有清理数据以使其唯一)但是我什至对这些表也进行了 PK,因为能够唯一标识一条记录非常有帮助。
  • 表 A 和 C 是从数据库中的其他表聚合数据的表。表 B 是用于生成报告的视图的基表。这就是它的设计方式,而不是我的决定,我无法改变它。我只需要与之斗争。

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


【解决方案1】:

您可以根据您的条件对不匹配的行执行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 的资料。

【讨论】:

    【解决方案2】:

    为什么需要光标?

    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。

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

    【讨论】:

      猜你喜欢
      • 2013-01-23
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多