问题描述
嗨,汤姆,
您能否阐明为什么以下简单sql返回结果?
起初它看起来像满足null = 'X' 条件。在decode中的默认值之后使用 () 是对整个decode的左外连接的等效吗?以下查询是否与前一个查询等效?
您能否阐明为什么以下简单sql返回结果?
select a.dummy, b.dummy, decode ( a.dummy, 'X', null, b.dummy ) from dual a, dual b where decode ( a.dummy, 'X', null, b.dummy (+) ) = a.dummy ;
起初它看起来像满足null = 'X' 条件。在decode中的默认值之后使用 () 是对整个decode的左外连接的等效吗?以下查询是否与前一个查询等效?
select a.dummy, b.dummy, decode ( a.dummy, 'X', null, b.dummy ) from dual a left outer join dual b on decode ( a.dummy, 'X', null, b.dummy ) = a.dummy ;
专家解答
是的,这两个语句是等效的。
请记住,外部联接始终返回外部表中的所有行。它从内部表中返回满足连接条件的行。
在这些查询中,A是外部表,因此您将在输出中从此表获得一行。
然后,您将从B获得行,其中:
解码 (a.dummy,'X',null,b.dummy ( ) )
是真的。这将X映射到null,所以条件是:
null = 假人
这是未知的。因此,您不会从B获得任何行。
这与您得到的结果相匹配:
请记住,外部联接始终返回外部表中的所有行。它从内部表中返回满足连接条件的行。
在这些查询中,A是外部表,因此您将在输出中从此表获得一行。
然后,您将从B获得行,其中:
解码 (a.dummy,'X',null,b.dummy ( ) )
是真的。这将X映射到null,所以条件是:
null = 假人
这是未知的。因此,您不会从B获得任何行。
这与您得到的结果相匹配:
select a.dummy a_dum, b.dummy b_dum, decode ( a.dummy, 'X', null, b.dummy ) from dual a, dual b where 解码 (a.dummy,'X',null,b.dummy ( ) ) = a.dummy; A_DUM B_DUM DECODE(A.DUMMY,'X',NULL,B.DUMMY) X
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




