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

简介: 避坑,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 过滤,即先连表再过滤。

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

相关文章
|
11天前
|
Oracle 关系型数据库 MySQL
mysql数据库和Oracle的区别
mysql数据库和Oracle的区别
54 1
|
6月前
|
SQL Oracle 关系型数据库
MySQL和Oracle的一些区别
MySQL和Oracle的一些区别
|
9月前
|
SQL Oracle 关系型数据库
解决:Oracle数据库中Left join on 后面为null时匹配不上
解决:Oracle数据库中Left join on 后面为null时匹配不上
143 0
|
8月前
|
Oracle 关系型数据库 数据库
PostgreSQL和Oracle两种数据库有啥区别?如何选择?
PostgreSQL和Oracle两种数据库有啥区别?如何选择?
252 0
|
11天前
|
SQL Oracle 关系型数据库
Oracle查询优化-left join、right join、inner join、full join和逗号的区别
【1月更文挑战第5天】【1月更文挑战第13篇】实际查询时,多表联查是常规操作,但是连接方式有多种。
101 0
|
8月前
|
Oracle 关系型数据库
Oracle 11g和12c的主要区别
Oracle 11g和12c的主要区别
|
9月前
|
Oracle 关系型数据库 数据库
一篇文章带你了解Oracle 数据库中 CROSS JOIN(cross join) 语法的作用
一篇文章带你了解Oracle 数据库中 CROSS JOIN(cross join) 语法的作用
395 0
|
3天前
|
Oracle 关系型数据库 Java
实时计算 Flink版操作报错之读取Oracle数据库时遇到找不到驱动,是什么原因
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
实时计算 Flink版操作报错之读取Oracle数据库时遇到找不到驱动,是什么原因
|
8天前
|
Oracle 关系型数据库 MySQL
实时计算 Flink版操作报错合集之采集oracle的时候报ORA-65040:不允许从可插入数据库内部执行该操作如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
31 3
|
11天前
|
SQL Oracle 安全
Oracle11g更改数据库名(详细教程)
Oracle11g更改数据库名(详细教程)
18 1