关于oracle中的半连接

简介: 表的连接在sql语句中尤为重要。外连接,内连接,半连接,反连接等等各种连接,看似简单的一个连接里面还是有不少的细节的。对于sql调优来说也是很重要的。 像下面的形式的sql就属于半连接,使用了in子句,对于exists的实现也是属于半连接。

表的连接在sql语句中尤为重要。外连接,内连接,半连接,反连接等等各种连接,看似简单的一个连接里面还是有不少的细节的。对于sql调优来说也是很重要的。
像下面的形式的sql就属于半连接,使用了in子句,对于exists的实现也是属于半连接。

--in半连接
SQL> select dname from dept dept where deptno in (select deptno from emp emp);

DNAME
--------------
RESEARCH
SALES
ACCOUNTING

--exists半连接

SQL> select dname from dept dept where exists (select null from emp emp where emp.deptno=dept.deptno)
  2  /

DNAME
--------------
RESEARCH
SALES
ACCOUNTING

可能对于上面两种连接大家不以为然,认为把需要用到的表直接放在from子句后效果是一致的,答案也不是肯定的。
比如下面的形式,可能输出的结果就多了很多。大概14条记录,但是通过半连接的方式会输出3行记录。
SQL> select dept.dname from dept dept,emp empwhere dept.deptno=emp.deptno;
DNAME
--------------
RESEARCH
SALES
SALES
RESEARCH
SALES
SALES
ACCOUNTING
RESEARCH
ACCOUNTING
SALES
RESEARCH
SALES
RESEARCH
ACCOUNTING
14 rows selected.

所以说如果要得到一个相同的输出结果,还是需要distinct+inner join

SQL> select distinct dept.dname from dept dept,emp emp where dept.deptno=emp.deptno;

DNAME
--------------
ACCOUNTING
RESEARCH
SALES

对于半连接的可替换实现,大体有以下几种方式
--使用集合

select dept.dname from dept dept,
(select deptno from dept
intersect
select deptno from emp emp)b
where dept.deptno=b.deptno ;

DNAME
--------------
ACCOUNTING
RESEARCH
SALES

--使用any

SQL> select dept.dname from dept dept where deptno=any(select deptno from emp emp);

DNAME
--------------
RESEARCH
SALES
ACCOUNTING

--使用distinct和内连接

SQL> select distinct emp.deptno from dept dept,emp emp
    where dept.deptno=emp.deptno;
    DEPTNO
----------
        30
        20
        10
SQL> select distinct dept.deptno from dept dept,emp emp
        where dept.deptno=emp.deptno;
    DEPTNO
----------
        30
        20
        10

大体说了下关于半连接的一些实现,可能在实际的使用中,最直观的感受还是通过执行计划来看到。
启用了半连接,在执行计划中会有semi的字样。


也可以手动指定不需要走半连接。使用Hint no_semijoin

目录
相关文章
|
2月前
|
监控 Linux
Linux系统监控报告CPU软锁定问题(soft lockup)诊断方法
以上方法结合起来使用将大大提高解决此类问题效率与成功率。实际操作过程需谨慎考虑当前环境与场景特点选择合适方法,并且要注意数据备份与恢复计划防止误操作造成不可挽回损失。
465 13
|
缓存 Linux 开发工具
CentOS 7- 配置阿里镜像源
阿里镜像官方地址http://mirrors.aliyun.com/ 1、点击官方提供的相应系统的帮助 :2、查看不同版本的系统操作: 下载源1、安装wget yum install -y wget2、下载CentOS 7的repo文件wget -O /etc/yum.
261071 0
|
SQL 存储 关系型数据库
深入OceanBase内部机制:系统架构与组件精讲
深入OceanBase内部机制:系统架构与组件精讲
深入OceanBase内部机制:系统架构与组件精讲
|
Web App开发 安全 小程序
Edge ERR_SSL_VERSION_OR_CIPHER_MISMATCH问题解决
以往应用的一些系统,可能因为年代久远,只能支持SSL的低版本协议,在Win 10和Win 11强制使用edge取代Internet explore以后: - 因为edge本身默认不支持低版本的SSL协议; - 老旧系统可能本身只能支持Internet explore。
5137 1
|
Oracle 关系型数据库 Linux
Oracle 数据库设置最大进程数参数方法,oracle最大进程数满了处理方法,sysdba管理员登录报“maximum number of processes (150) exceeded“问题解决
Oracle 数据库设置最大进程数参数方法,oracle最大进程数满了处理方法,sysdba管理员登录报“maximum number of processes (150) exceeded“问题解决
1426 0
Oracle 数据库设置最大进程数参数方法,oracle最大进程数满了处理方法,sysdba管理员登录报“maximum number of processes (150) exceeded“问题解决
|
Oracle 关系型数据库 数据库
Bug 20250147 - ORA-600 [kjxmgmb_nreq:bat]
今天巡检遇到数据库报错 ORA-00600错误,数据库版本为Oracle 11204 (x86_64),错误日志如下:
Bug 20250147 - ORA-600 [kjxmgmb_nreq:bat]
|
Oracle 关系型数据库 数据安全/隐私保护
Oracle学习笔记之19c的公共用户和本地用户
Oracle学习笔记之19c的公共用户和本地用户
3374 0
Oracle学习笔记之19c的公共用户和本地用户
|
SQL Oracle 关系型数据库
Oracle AWR快照管理与常见问题
1、手动创建Snapshots exec dbms_workload_repository.create_snapshot(); --或者 BEGIN DBMS_WORKLOAD_REPOSITORY.
14692 0
|
SQL Oracle 关系型数据库
ORACLE 临时表空间使用率过高的原因及临时解决方案
          数据库temp临时表空间增大,一般在数据安装时设置临时表空间大小,默认的情况下都是设置为自动增长。
2189 0