在 join 子句中引入 where 条件是不好的做法

Asc*_*ant 1 best-practices

在下面的查询中,条件

and r.master_seq=206
Run Code Online (Sandbox Code Playgroud)

在 on 子句上用作连接条件。在程序代码中,值r.master_seq由参数设置。

我担心的是,我不确定将这种条件(r=.master_seq=123,我认为应该是 where 条件)混合到连接条件中是否可以。
我在想我应该只在 join 子句中使用关系信息(主键和外键),而不是 where 条件( where id=123, balance>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) 
Run Code Online (Sandbox Code Playgroud)

Ken*_*her 9

WHERE子句中放置条件和ON子句是两件非常不同的事情。该ON条款是JOIN. 现在使用 ,INNER JOIN您不会看到输出有任何差异(除非也使用GROUP BY ALL)。但是,这OUTER JOIN是一个不同的故事。如果您将该特定条件移动到WHERE子句中,它实际上会(除其他外)否定OUTER您的查询部分。

我写了一篇文章,这里有几个例子。

请记住,该ON子句将两个表连接在一起。该WHERE子句从输出中排除行。对于您的具体示例,假设您有一行 inTB_REQUEST_DATA没有匹配TB_SPOT_REPORT_REQUEST。随着在r.master_seq = 206ON的条款 OUTER JOIN,你会得到与返回值的行TB_REQUEST_DATA,但NULLsTB_SPOT_REPORT_REQUEST列。另一方面,如果您将它放在WHERE子句中,它将完全消除该行。

然而,假设您想要每一行,TB_REQUEST_DATA但只需要TB_SPOT_REPORT_REQUESTmaster_seq = 206 AND SEQ = REQUEST_SEQ 中的信息。这就是你将条件放入ON子句的时候。