避坑,Oracle中left join 与 (+) 的区别

Posted 浅殇忆流年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了避坑,Oracle中left join 与 (+) 的区别相关的知识,希望对你有一定的参考价值。

下面通过一个演示例子,可以很明显的知晓两者的区别!!!

示例演示:创建两张表分别是:shun_a 表、shun_b 表。

-- 创建表 SHUN_A
create table SHUN_A
(
  a_id      VARCHAR2(12) not null,
  a_name    VARCHAR2(12),
  a_content VARCHAR2(12),
  b_id      VARCHAR2(12)
)

insert into shun_a (A_ID, A_NAME, A_CONTENT, B_ID)values ('a1', '111', '1', 'b1');
insert into shun_a (A_ID, A_NAME, A_CONTENT, B_ID)values ('a2', '222', '1', 'b2');
insert into shun_a (A_ID, A_NAME, A_CONTENT, B_ID)values ('a3', '333', '2', 'b3');
insert into shun_a (A_ID, A_NAME, A_CONTENT, B_ID)values ('a4', '444', '3', 'b4');
insert into shun_a (A_ID, A_NAME, A_CONTENT, B_ID)values ('a5', '555', '3', 'b100');
commit;


-- 创建表 SHUN_B
create table SHUN_B
(
  b_id   VARCHAR2(12) not null,
  b_name VARCHAR2(12),
  b_flag VARCHAR2(12)
)

insert into shun_b (B_ID, B_NAME, B_FLAG)values ('b1', 'b1', '1');
insert into shun_b (B_ID, B_NAME, B_FLAG)values ('b2', 'b2', '1');
insert into shun_b (B_ID, B_NAME, B_FLAG)values ('b3', 'b3', '0');
insert into shun_b (B_ID, B_NAME, B_FLAG)values ('b4', 'b4', '0');
insert into shun_b (B_ID, B_NAME, B_FLAG)values ('b5', 'b5', '1');
insert into shun_b (B_ID, B_NAME, B_FLAG)values ('b6', 'b6', '0');
commit;
  • 首先执行下面的left join SQL语句。
select a.*, b.b_name, b.b_flag from shun_a a left join shun_b b on a.b_id = b.b_id ;

执行结果如下:

  • 执行(+)SQL语句。
select a.*, b.b_name, b.b_flag from shun_a a, shun_b b where a.b_id = b.b_id(+) ;

执行结果如下:

通过上面的两个SQL进行对比发现,两者执行的结果没有什么区别。

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


下面演示存在子查询条件的情况:

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; -- 先执行过滤条件,再连接表

注:上面SQL等价于:

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, shun_b b where a.b_id = b.b_id(+) and b.b_flag = 1; -- 表连接后再执行过滤条件

总结:

存在子查询的条件下:

  • left join是先在shun_b表进行 b_flag=1 过滤,再进行表连接。

  • (+)是在表连接的前提下进行 b_flag=1 过滤,即先连表再过滤。

不存在子查询的条件下,两者的查询结果相同。

以上是关于避坑,Oracle中left join 与 (+) 的区别的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中 (+)与left join 的用法区别

Oracle的left join中on和where的区别

MySQL之LEFT JOIN中使用ON和WHRERE对表数据

深入Oracle的left join中on和where的区别详解

oracle数据库中,left join后 where 的使用方法有哪些?

Oracle的left join中on和where的区别