Best-Practices
在連接子句中引入 where 條件是不好的做法
在下面的查詢中,條件
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
沒有匹配 inTB_SPOT_REPORT_REQUEST
。使用 r.master_seq=206 在 the 的ON
子句中,OUTER JOIN
您將獲得一行返回的值,TB_REQUEST_DATA
但NULLs
在TB_SPOT_REPORT_REQUEST
列中。另一方面,如果您將其放在WHERE
子句中,它將完全消除該行。但是,假設您想要每一行
TB_REQUEST_DATA
但只需要TB_SPOT_REPORT_REQUEST
master_seq = 206 AND SEQ = REQUEST_SEQ 中的資訊。那就是你將條件放入ON
子句的時候。