2008-10-31 66 views
0

我有两个表TAB_A和TAB_B。 TAB_A是主表,TAB_B是子/事务表。 TAB_A具有COL_A(主键),而TAB_B具有COL_B(主键)以及COL_A。DB2查询输出 - 不同行为

由于某些商业原因,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) 

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

DB2版本9.5在AIX

+0

请确认第一个查询与描述完全相同,并确实返回4条记录。它不应该返回任何东西,如果COL_A的值1,2,3,4不存在于TAB_B中。 – 2008-10-31 08:40:01

+0

显然在第二个查询中存在拼写错误,也许您在说A.COL_A = B.COL_C或其他一些错字 – Hogan 2013-11-18 16:01:59

回答

0

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

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

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

0

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

此外,我以前在Oracle和SQL Server工作。上面的语法工作正常。仍然不确定为什么输出不同,只是因为在SELECT子句中添加了额外的列

+0

您有一个错字,并且这不是您添加到您的问题的正确位置,成为问题的一部分。 – Hogan 2013-11-18 16:01:13

1

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

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

0

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

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

您需要编写一个明确的“LEFT OUTER JOIN”来获取行,但A.COL_A总是返回NULL。