首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DB2查询输出-不同的行为

DB2查询输出-不同的行为
EN

Stack Overflow用户
提问于 2008-10-31 08:18:58
回答 4查看 581关注 0票数 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个值,在COL_A of TAB_A中没有对应的匹配值。(它们是孤立记录,是错误创建的)

当我发出以下SELECT查询时,我得到四条记录

代码语言:javascript
运行
复制
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,则不会返回任何记录。

代码语言:javascript
运行
复制
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版

EN

回答 4

Stack Overflow用户

发布于 2008-11-03 20:30:58

这两个查询应该返回相同的行。如果这真的如您所描述的那样运行,那么您在DB2中发现了一个bug。

您试图使用此查询完成什么任务?如果B.COL_A的值(1、2、3、4)是孤立记录,则此查询不应返回任何行。如果您打算搜索孤立对象,则可能需要执行某种外部联接。

票数 1
EN

Stack Overflow用户

发布于 2008-10-31 09:27:06

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2008-10-31 14:21:12

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/252862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档