0

我有两个表 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)

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

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

4 回答 4

1

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

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

于 2008-11-03T20:30:58.087 回答
0

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

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

于 2008-10-31T14:21:11.610 回答
0

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

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

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

于 2008-10-31T09:27:05.700 回答
0

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

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

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

于 2014-03-03T08:57:32.703 回答