oracle 中 (+) 与左连接(left join)的区别

在除了连接条件外,没有子查询条件时,两者是一样的,但是有其他条件时不能直接用(+)。

有两个表如下

shun_a 表:
   a_id     a_name     a_content     b_id 
1	a1	 111	  1	      b1
2	a2	 222	  1	      b2
3	a3	 333	  2	      b3
4	a4	 444	  3	      b4
5	a5	 555	  3	      b100

shun_b 表:
       b_id    b_name    b_flag
1	 b1      b1      1
2	 b2      b2      1
3	 b3      b3      0
4	 b4      b4      0
5	 b5      b5      1
6	 b6      b6      0

没有子查询条件时,执行结果一样:

SELECT a.*, b.b_name, b.b_flag FROM shun_a a, shun_b b where a.b_id = b.b_id(+);

SELECT a.*, b.b_name, b.b_flag FROM shun_a a left join shun_b b on a.b_id = b.b_id;

结果都为(此结果称为“结果1”):

oracle 中 (+) 与左连接(left join)的区别_第1张图片

 

但是有子查询语句时,结果不一样。(+)为表连接后再执行过滤条件,left join为先执行过滤条件再连接表;如:

SELECT a.*, b.b_name, b.b_flag FROM shun_a a, shun_b b where a.b_id = b.b_id(+) and b.b_flag = 1;

SELECT a.*, b.b_name, b.b_flag FROM shun_a a left join shun_b b on a.b_id = b.b_id and b.b_flag = 1;

前者(+)是在结果1的前提下进行 b_flag=1 过滤,即先连表再过滤,结果为:

(+)的结果

后者left join是先在shun_b表进行 b_flag=1 过滤,再进行表连接,结果为:

oracle 中 (+) 与左连接(left join)的区别_第2张图片

你可能感兴趣的:(oracle)