Best-Practices

在連接子句中引入 where 條件是不好的做法

  • January 18, 2016

在下面的查詢中,條件

and r.master_seq=206

在 on 子句上用作連接條件。在程式碼中, 的值r.master_seq由參數設置。

我擔心的是我不確定是否可以將這個條件(r=.master_seq=123,我認為應該是 where 條件)混合到連接條件中。

我在想我應該只在 join 子句中使用關係資訊(主鍵和外鍵),而不是 where 條件(其中 id=123,餘額>300 等)。

SELECT
 *
FROM
TB_REQUEST_DATA D

left outer join
TB_SPOT_REPORT_REQUEST r
on D.SEQ = r.REQUEST_SEQ  
and r.master_seq=206

WHERE
 d.SEQ IN (
 7,12,5,11,4
 )


desc tb_request_data;
Name          Null     Type          
------------- -------- ------------- 
SEQ           NOT NULL NUMBER        
REQUEST_NM    NOT NULL VARCHAR2(50)  
REG_DT        NOT NULL DATE          
REG_ID        NOT NULL VARCHAR2(20)  
UP_DT         NOT NULL DATE          
UP_ID         NOT NULL VARCHAR2(20)  
DISASTER_TYPE          VARCHAR2(500) 

desc TB_SPOT_REPORT_REQUEST;
Name         Null     Type          
------------ -------- ------------- 
MASTER_SEQ   NOT NULL NUMBER        
SEQ          NOT NULL NUMBER        
REQUEST_SEQ  NOT NULL NUMBER        
REAL_FILE_NM          VARCHAR2(100) 
DOWN_FILE_NM          VARCHAR2(100) 

將條件放入WHERE子句和ON子句中是兩件非常不同的事情。該ON子句是JOIN. 現在有了 aINNER JOIN你不會看到輸出有任何區別(除非也使用GROUP BY ALL)。但OUTER JOIN一個不同的故事。如果您將該特定條件移動到WHERE子句中,它將(除其他外)實際上否定OUTER您的查詢部分。

我在這裡寫了一篇文章,裡面有幾個例子。

請記住,該ON子句將兩個表連接在一起。該WHERE子句從輸出中排除行。對於您的具體範例,假設您有一行 inTB_REQUEST_DATA沒有匹配 in TB_SPOT_REPORT_REQUEST。使用 r.master_seq=206 在 the 的ON子句中, OUTER JOIN您將獲得一行返回的值,TB_REQUEST_DATANULLsTB_SPOT_REPORT_REQUEST列中。另一方面,如果您將其放在WHERE子句中,它將完全消除該行。

但是,假設您想要每一行TB_REQUEST_DATA但只需要TB_SPOT_REPORT_REQUESTmaster_seq = 206 AND SEQ = REQUEST_SEQ 中的資訊。那就是你將條件放入ON子句的時候。

引用自:https://dba.stackexchange.com/questions/126473