Oracle左连接中多个约束条件

2024-01-13 07:38

本文主要是介绍Oracle左连接中多个约束条件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

很多时候,我们使用左连接或者右连接都是为了简单的匹配我们需要连接的某张表里对应的数据
简单是因为只有一个约束条件,类似于a.id=b.id(+)的写法。但当我们需要对表添加多重约束的时候
可能会出现一些问题,如:造成左连接中左边数据的丢失或右连接中右边数据的丢失。
接下来就对这一问题进行讲解。

存在两张表 。

dept表

create table dept
(deptno int primary key, --部门编号dname nvarchar(30),--部门名称loc nvarchar(30) --地址
)

emp表

create table emp
(empno int primary key,--雇员编号ename nvarchar(30),--雇员姓名job nvarchar(30),--雇员职务mgr int,--雇员上级编号hiredate datetime,--雇佣日期sal numeric(10,2),--薪水comm numeric(10,2),--奖金deptno int foreign key references dept(deptno) --因为deptno我们根据需要做成外键
)

例如:以左连接为例,如果我们只是想简单的根据雇员所在部门的编号查询部门名称。

那么我们只需要简单的这样写

select empno,ename,job,deptno,dname from emp left join dept on emp.deptno=dept.deptno;
--或者这样写
select empno,ename,job,deptno,dname from emp,dept where emp.deptno=dept.deptno(+);

但是当左连接中有多个条件约束条件,那该怎么办呢?
在上例中,如果我想再加一个条件dept中的loc为'Madrid'.
则用left join可以这样写

select empno,ename,job,deptno,dname from emp left join dept on emp.deptno=dept.deptno and dept.loc='Madrid';--没问题

很多人在用+写法的时候会这样写

select empno,ename,job,deptno,dname from emp,dept where emp.deptno=dept.deptno(+) and dept.loc='Madrid';--有问题

这种写法会造成的问题是:在dept表中,如果没有与dept表中deptno对应的emp表数据也会消失,约束条件就和emp.deptno=dept.deptno一样了。
这样显然是不正确的。
如果想使用左连接,同时又想增加'='右边表的多重约束,有两种办法。
一是再加上右表限制的同时也需要添加(+),如where emp.deptno=dept.deptno(+) and dept.loc(+)='Madrid'
二是在from中就将右边的表中的数据进行筛选,from emp,(select * from dept where dept.loc='Madrid') dt where emp.deptno=dt.deptno(+)


而对左连接等号左边的表(如上面说的emp表)字段的约束条件则没有这些要求,其他的外连接和左连接类似。

总结:

对于外连接, 也可以使用“(+) ”来表示。 关于使用(+)的一些注意事项:

1.(+)操作符只能出现在where子句中,并且不能与outer join语法同时使用。
2. 当使用(+)操作符执行外连接时,如果在where子句中包含有多个条件,则必须在所有条件中都包含(+)操作符
3.(+)操作符只适用于列,而不能用在表达式上。
4.(+)操作符不能与or和in操作符一起使用。
5.(+)操作符只能用于实现左外连接和右外连接,而不能用于实现完全外连接。

这篇关于Oracle左连接中多个约束条件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/600697

相关文章

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

Oracle修改端口号之后无法启动的解决方案

《Oracle修改端口号之后无法启动的解决方案》Oracle数据库更改端口后出现监听器无法启动的问题确实较为常见,但并非必然发生,这一问题通常源于​​配置错误或环境冲突​​,而非端口修改本身,以下是系... 目录一、问题根源分析​​​二、保姆级解决方案​​​​步骤1:修正监听器配置文件 (listener.

java连接opcua的常见问题及解决方法

《java连接opcua的常见问题及解决方法》本文将使用EclipseMilo作为示例库,演示如何在Java中使用匿名、用户名密码以及证书加密三种方式连接到OPCUA服务器,若需要使用其他SDK,原理... 目录一、前言二、准备工作三、匿名方式连接3.1 匿名方式简介3.2 示例代码四、用户名密码方式连接4

MySQL 表的内外连接案例详解

《MySQL表的内外连接案例详解》本文给大家介绍MySQL表的内外连接,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录表的内外连接(重点)内连接外连接表的内外连接(重点)内连接内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

Python函数返回多个值的多种方法小结

《Python函数返回多个值的多种方法小结》在Python中,函数通常用于封装一段代码,使其可以重复调用,有时,我们希望一个函数能够返回多个值,Python提供了几种不同的方法来实现这一点,需要的朋友... 目录一、使用元组(Tuple):二、使用列表(list)三、使用字典(Dictionary)四、 使

电脑蓝牙连不上怎么办? 5 招教你轻松修复Mac蓝牙连接问题的技巧

《电脑蓝牙连不上怎么办?5招教你轻松修复Mac蓝牙连接问题的技巧》蓝牙连接问题是一些Mac用户经常遇到的常见问题之一,在本文章中,我们将提供一些有用的提示和技巧,帮助您解决可能出现的蓝牙连接问... 蓝牙作为一种流行的无线技术,已经成为我们连接各种设备的重要工具。在 MAC 上,你可以根据自己的需求,轻松地

宝塔安装的MySQL无法连接的情况及解决方案

《宝塔安装的MySQL无法连接的情况及解决方案》宝塔面板是一款流行的服务器管理工具,其中集成的MySQL数据库有时会出现连接问题,本文详细介绍两种最常见的MySQL连接错误:“1130-Hostisn... 目录一、错误 1130:Host ‘xxx.xxx.xxx.xxx’ is not allowed

Oracle 通过 ROWID 批量更新表的方法

《Oracle通过ROWID批量更新表的方法》在Oracle数据库中,使用ROWID进行批量更新是一种高效的更新方法,因为它直接定位到物理行位置,避免了通过索引查找的开销,下面给大家介绍Orac... 目录oracle 通过 ROWID 批量更新表ROWID 基本概念性能优化建议性能UoTrFPH优化建议注

PostgreSQL 序列(Sequence) 与 Oracle 序列对比差异分析

《PostgreSQL序列(Sequence)与Oracle序列对比差异分析》PostgreSQL和Oracle都提供了序列(Sequence)功能,但在实现细节和使用方式上存在一些重要差异,... 目录PostgreSQL 序列(Sequence) 与 oracle 序列对比一 基本语法对比1.1 创建序