DB2 查询输出 - 不同的行为

Posted

技术标签:

【中文标题】DB2 查询输出 - 不同的行为【英文标题】:DB2 Query Output - Different Behavior 【发布时间】: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 或其他一些错字 【参考方案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 的列”,但这似乎是一种奇怪的行为选择。您是否找到了一些说明情况(或类似情况)的文档?否则,我完全期望其他事情正在(正在)发生。

以上是关于DB2 查询输出 - 不同的行为的主要内容,如果未能解决你的问题,请参考以下文章

优化 DB2 查询 - 为啥 bash“时间”输出保持不变?

接收 DB2 中列 SUM 的不同输出

按组的 DB2 逗号分隔输出

在 CMD 和 PowerShell 中管道时的不同行为和输出

在 CMD 和 PowerShell 中管道时的不同行为和输出

从 DB2 命令获取 REXX 中的输出