在除了连接条件外,没有子查询条件时,两者是一样的,但是有其他条件时不能直接用(+)(如要使用则每个连接表都需要加上+)。
有两个表如下
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”):
但是有子查询语句时,结果不一样。(+)为表连接后再执行过滤条件,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;
(要使用(+),则每个连接都需要加上(+),即等价于
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;)
前者(+)是在结果1的前提下进行 b_flag=1 过滤,即先连表再过滤,结果为:
后者left join是先在shun_b表进行 b_flag=1 过滤,再进行表连接,结果为: