【问题标题】:DB2 Query Output - Different BehaviorDB2 查询输出 - 不同的行为
【发布时间】:2008-10-31 08:18:57
【问题描述】:

我有两个表 TAB_A 和 TAB_B。 TAB_A 是主表,TAB_B 是子/事务表。 TAB_A 具有 COL_A(主键),TAB_B 具有 COL_B(主键)和 COL_A。

由于某些业务原因,未在 COL_A 列的 TAB_A 和 TAB_B 之间定义外键。

TAB_B 中有 4 条记录,COL_A 中的值分别为 1、2、3 和 4,但在 TAB_A 的 COL_A 中没有对应的匹配值。 (它们是孤儿记录,错误创建的)

当我发出以下 SELECT 查询时,我得到四条记录

SELECT B.COL_B,
       B.COL_A
  FROM TAB_A A,
       TAB_B B
 WHERE A.COL_A = B.COL_A
   AND B.COL_A IN (1, 2, 3, 4)

但如果我在 SELECT 查询中开始引用 A.COL_A,则不会返回任何记录。

SELECT B.COL_B,
       B.COL_A,
       A.COL_A
  FROM TAB_A A,
       TAB_B B
 WHERE A.COL_A = B.COL_A
   AND B.COL_A IN (1, 2, 3, 4)

有人能解释一下这种奇怪的行为吗?

AIX 中的 DB2 版本 9.5

【问题讨论】:

  • 请确认第一个查询与描述的完全一样,并且它实际上返回了 4 条记录。如果 COL_A 的值 1、2、3、4 在 TAB_B 中不存在,则它不应返回任何内容。
  • 很明显,第二个查询中有错字,也许你说的是 A.COL_A = B.COL_C 或其他一些错字

标签: sql db2


【解决方案1】:

两个查询应该返回相同的行。如果这确实如您所描述的那样,那么您在 DB2 中发现了一个错误。

你想用这个查询来完成什么?如果 B.COL_A 的值 (1,2,3,4) 是孤立记录,则此查询不应返回任何行。如果您打算搜索孤儿,您可能需要进行某种外连接。

【讨论】:

    【解决方案2】:

    您应该在内部联接中使用 ON 子句而不是 WHERE 子句。 ON 子句与实际连接相关,而 WHERE 通常用于与连接无关的额外条件。

    IBM says: “连接条件在 ON 关键字之后指定,并确定如何将两个表相互比较以产生连接结果 [...] 与实际连接无关的任何其他条件都在 WHERE 中指定子句或作为 ON 子句中实际连接的一部分。"

    在您的示例中,您似乎在做相反的事情,将您的连接条件放在 WHERE 子句中。 AFAIK,这不是非法的,但是当与仅引用其中一个表中的列的 SELECT 子句一起使用时,它可以解释这种奇怪的行为。

    【讨论】:

      【解决方案3】:

      我查看了 IBM 站点中的文档。虽然他们谈论使用“JOIN”,但也提到使用“WHERE”条件(我使用过)使用直接连接,并提到它们应该产生相同的结果。

      另外,我以前曾在 Oracle 和 SQL Server 工作过。上面的语法工作得很好。仍然不确定为什么输出不同,只是因为在 SELECT 子句中添加了一个额外的列

      【讨论】:

      • 您有错字,这不是您添加问题的正确位置,此内容应该是问题的一部分。
      【解决方案4】:

      您的第二个 SQL 实际上是一个“INNER JOIN”。

      由于表 B 的第 1、2、3、4 行是孤立的,因此条件 A.COL_A = B.COL_A 永远不会为真。

      您需要编写显式的“LEFT OUTER JOIN”代码来取回行,但 A.COL_A 将始终返回 NULL。

      【讨论】:

      • 第一个查询不是INNER JOIN,因为......?我看着这个并想,“好吧,也许它正在将它评估为LEFT JOIN,因为SELECT 列表中没有提到来自TAB_A 的列”,但这似乎是一种奇怪的行为选择。您是否找到了一些说明情况(或类似情况)的文档?否则,我完全期望其他事情正在(正在)发生。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      相关资源
      最近更新 更多