DB2查询输出 - 不同的行为

时间:2008-10-31 08:18:58

标签: sql db2

我有两个表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中有四条记录,其中一些值在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 V9.5

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

此外,我之前曾在Oracle和SQL Server工作过。上面的语法运行正常。仍然不确定为什么输出不同,只是因为在SELECT子句

中添加了一个额外的列

答案 3 :(得分:0)

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

由于表B行1,2,3,4是孤儿,因此条件A.COL_A = B.COL_A永远不会成立。

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