我有两个表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个值,在COL_A of TAB_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版
发布于 2008-11-03 20:30:58
这两个查询应该返回相同的行。如果这真的如您所描述的那样运行,那么您在DB2中发现了一个bug。
您试图使用此查询完成什么任务?如果B.COL_A的值(1、2、3、4)是孤立记录,则此查询不应返回任何行。如果您打算搜索孤立对象,则可能需要执行某种外部联接。
发布于 2008-10-31 09:27:06
您应该在内部联接中使用ON子句,而不是WHERE子句。ON子句与实际联接相关,而WHERE通常用于与联接无关的额外条件。
IBM says:“连接条件在ON关键字之后指定,并确定如何将两个表相互比较以生成连接结果...与实际连接无关的任何附加条件都是在WHERE子句中指定的,或者是作为ON子句中实际连接的一部分指定的。”
在您的示例中,您似乎做了相反的事情,在WHERE子句中使用联接条件。AFAIK,这不是非法的,但它可以解释这种奇怪的行为,当与仅引用其中一个表中的列的SELECT子句一起使用时。
发布于 2008-10-31 14:21:12
我查看了IBM站点上的文档。尽管他们谈到了使用" join ",但也提到了使用使用"WHERE“条件的直接连接(我使用了这个条件),并提到它们应该产生相同的结果。
另外,我以前在Oracle和SQL Server中工作过。上面的语法运行得很好。仍然不确定为什么输出会有所不同,只是因为在SELECT子句中添加了额外的列
https://stackoverflow.com/questions/252862
复制相似问题