开发者社区 问答 正文

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版本9.5

展开
收起
SONGYiiiD 2019-12-03 22:41:06 500 分享 版权
阿里云 AI 助理回答

这种现象可以通过SQL的执行逻辑和JOIN操作的原理来解释。在你的第一个查询中:

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)

这里你使用了旧式的笛卡尔积(CARTESIAN JOIN)语法,尽管没有显式写出JOIN关键字,但实际上执行的是一个内连接(INNER JOIN)。这个查询会返回TAB_A和TAB_B表中COL_A匹配的所有记录。由于你的条件是B.COL_A IN (1, 2, 3, 4),并且A.COL_A = B.COL_A,理论上应该不会返回任何结果,因为TAB_A中并没有这些值。但是,由于DB2(以及许多数据库系统)在处理这类没有外键约束的情况时,可能会因为优化器的选择或实现细节,意外地返回了TAB_B中满足条件的记录,即使它们在TAB_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)

你同样尝试进行内连接,并且试图从A表中也选择COL_A列。在这个情况下,DB2严格遵循了内连接的规则:只有当A表和B表中的COL_A有匹配时,才会返回结果。因为实际上TAB_A中并不存在B.COL_A为1、2、3、4的记录,所以这次查询正确地没有返回任何结果。

解决这个问题的一个方法是使用LEFT OUTER JOIN,这样可以确保即使在TAB_A中没有匹配项,也能返回TAB_B中的记录:

SELECT B.COL_B, B.COL_A, A.COL_A 
FROM TAB_B B 
LEFT OUTER JOIN TAB_A A ON A.COL_A = B.COL_A 
WHERE B.COL_A IN (1, 2, 3, 4)

这样的查询将明确地显示出那些在TAB_B中但不在TAB_A中的孤立记录。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: