我有两个表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
答案 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。