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

相关文章

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

oracle 11g导入\导出(expdp impdp)之导入过程

《oracle11g导入导出(expdpimpdp)之导入过程》导出需使用SEC.DMP格式,无分号;建立expdir目录(E:/exp)并确保存在;导入在cmd下执行,需sys用户权限;若需修... 目录准备文件导入(impdp)1、建立directory2、导入语句 3、更改密码总结上一个环节,我们讲了

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

Python批量替换多个Word文档的多个关键字的方法

《Python批量替换多个Word文档的多个关键字的方法》有时,我们手头上有多个Excel或者Word文件,但是领导突然要求对某几个术语进行批量的修改,你是不是有要崩溃的感觉,所以本文给大家介绍了Py... 目录工具准备先梳理一下思路神奇代码来啦!代码详解激动人心的测试结语嘿,各位小伙伴们,大家好!有没有想

python连接sqlite3简单用法完整例子

《python连接sqlite3简单用法完整例子》SQLite3是一个内置的Python模块,可以通过Python的标准库轻松地使用,无需进行额外安装和配置,:本文主要介绍python连接sqli... 目录1. 连接到数据库2. 创建游标对象3. 创建表4. 插入数据5. 查询数据6. 更新数据7. 删除

在 Spring Boot 中连接 MySQL 数据库的详细步骤

《在SpringBoot中连接MySQL数据库的详细步骤》本文介绍了SpringBoot连接MySQL数据库的流程,添加依赖、配置连接信息、创建实体类与仓库接口,通过自动配置实现数据库操作,... 目录一、添加依赖二、配置数据库连接三、创建实体类四、创建仓库接口五、创建服务类六、创建控制器七、运行应用程序八

解决hive启动时java.net.ConnectException:拒绝连接的问题

《解决hive启动时java.net.ConnectException:拒绝连接的问题》Hadoop集群连接被拒,需检查集群是否启动、关闭防火墙/SELinux、确认安全模式退出,若问题仍存,查看日志... 目录错误发生原因解决方式1.关闭防火墙2.关闭selinux3.启动集群4.检查集群是否正常启动5.

Oracle迁移PostgreSQL隐式类型转换配置指南

《Oracle迁移PostgreSQL隐式类型转换配置指南》Oracle迁移PostgreSQL时因类型差异易引发错误,需通过显式/隐式类型转换、转换关系管理及冲突处理解决,并配合验证测试确保数据一致... 目录一、问题背景二、解决方案1. 显式类型转换2. 隐式转换配置三、维护操作1. 转换关系管理2.

在Linux系统上连接GitHub的方法步骤(适用2025年)

《在Linux系统上连接GitHub的方法步骤(适用2025年)》在2025年,使用Linux系统连接GitHub的推荐方式是通过SSH(SecureShell)协议进行身份验证,这种方式不仅安全,还... 目录步骤一:检查并安装 Git步骤二:生成 SSH 密钥步骤三:将 SSH 公钥添加到 github