2017-01-11 27 views
1

我想知道如果两个查询将始终返回相同的结果。他们是平等的吗?如果桌子连接在一起,Where Statement是否重要?

SELECT OT_ACC_NO , ACC_NO FROM ACCOUNTS 
JOIN OTHER_TABLE ON OT_ACC_NO = ACC_NO 
WHERE ACC_NO IS NOT NULL 

SELECT OT_ACC_NO , ACC_NO FROM ACCOUNTS 
JOIN OTHER_TABLE ON OT_ACC_NO = ACC_NO 
WHERE OT_ACC_NO IS NOT NULL 
+0

仅有'JOIN'等于'INNER JOIN' - ([参考](HTTP://文档.oracle.com/CD/B28359_01/server.111/b28286/statements_10002.htm#i2080416)) –

回答

3

这里的条件没有产生任何合乎逻辑的影响。

INNER JOIN确保记录必须存在于两个表中,并且它们不能为NULL值。

5

这两者是等价的。也许更令人惊讶的是,WHERE条款是不必要的。所以,这相当于:

SELECT OT_ACC_NO, ACC_NO 
FROM ACCOUNTS JOIN 
    OTHER_TABLE 
    ON OT_ACC_NO = ACC_NO; 

为什么?因为INNER JOIN仅在ON条件为true时才返回行。如果任一值为NULL,则比较返回NULL,其被视为

我应该注意,虽然最终结果将是相同的,但查询的执行计划可能并不相同。

2

让我们一小步倒退,并考虑平等的运营商和NULL值:

SELECT CASE WHEN NULL = NULL THEN 'Equal' ELSE 'Not Equal' END FROM DUAL; 

现在,令人惊讶的一段,这将返回Not Equal

如果您认为NULL代表未知值,那么您是在询问未知值是否等于另一个未知值并且答案是错误的。

您所查询:

SELECT OT_ACC_NO, 
     ACC_NO 
FROM ACCOUNTS 
     JOIN OTHER_TABLE 
     ON OT_ACC_NO = ACC_NO 

这将加入表时OT_ACC_NO = ACC_NO,正如我们上面看到的,如果任这些变量是NULL(未知),那么平等比较的结果永远是假的并且这些行将从连接结果中排除。

因此,添加where子句中测试任OT_ACC_NOACC_NO是否NULL永远不会排除任何行,因为他们将已经被排除连接条件。

0

问题是标有Oracle,所以答案应该是有一个主题没有逻辑影响相当于相同的结果莫名其妙小心。

下面对于其中秒查询返回任何数据的情况下的采样数据,但是所述第一查询失败,ORA-01722: invalid number

create table ACCOUNTS as 
select '1-1' ACC_NO from dual; 


create table OTHER_TABLE as 
select cast(null as number) OT_ACC_NO from dual;