oracle——外连接查询
一、问题描述
有时我们为了保留某个表中的数据,而该表中的数据在另外一个关联表中未必都存在对应,此时就应该试用外连接查询。
比如:两个表,产品表和子产品表

注:子产品的parent_product_id便是产品表的id
产品可以有子产品,也可以没有子产品
遇到类似的问题需要使用外连接查询,保证所有的产品被查询出来,而其对应的子产品也在查询结果中。
二、问题解决
1.基础概念
笛卡尔积:例如,A={a,b}, B={0,1,2},则
即,一个集合在左和在右做“笛卡尔积”结果是不同的。
2.外连接查询
2.1左外连接查询
select *
from table_a a left join table_b b
on a.id = b.parent_id
这样的结果就是左边的表中的内容都会被保留,而右边表每条数据会对应左边表中对应的数据,结果中,右边表中的所有内容只出现一次(table_a和table_b是一对多关系,且table_b中记录只对应一个table_a中记录),而左边表中一条记录可能显示多次。
e.g.
select pp.product_id,pp.product_name,p.product_id,p.product_name
from edu_product pp--产品
left join sub_edu_product p--子产品
on pp.product_id = p.parent_product_id;

2.2右外连接
select *
from table_a a right join table_b b
on a.id = b.parent_id
这样的结果就是右边的表中的内容都会被保留,而右边表每条数据会对应左边表中对应的数据,结果中,右边表中的所有内容只出现一次(table_a和table_b是一对多关系,且table_b中记录只对应一个table_a中记录),而左边表中一条记录可能显示多次。和左外连接的区别是,左表不会保留多出来的数据
e.g.
select pp.product_id,pp.product_name,p.product_id,p.product_name
from edu_product pp--产品
right join sub_edu_product p--子产品
on pp.product_id = p.parent_product_id;

三、补充
试用外连接查询时有时会有一些疑问,总结在下面:
试用oracle中emp和dept表做示例
dept:
emp:
1.相同的左外连接查询得到不同的展示结果
select dept.deptno,dept.dname,
emp.ename,emp.empno
from dept left join emp
on dept.deptno = emp.deptno;

select emp.ename,emp.empno,
dept.deptno,dept.dname
from dept left join emp
on dept.deptno = emp.deptno;

结论:红色部分完全相同,说明外连接方向及条件一样,区别在查询的字段排序不同,导致结果不同。
而第二种结果不能代表此次查询是右外连接
2.on条件上等号左右字段颠倒,效果是否相同
select dept.deptno,dept.dname,
emp.ename,emp.empno
from dept left join emp
on dept.deptno = emp.deptno;

select dept.deptno,dept.dname,
emp.ename,emp.empno
from dept left join emp
on emp.deptno = dept.deptno;

结论:对比结果发现,没有任何区别
3.使用+号进行外连接查询
select *
from (select e.empno,e.ename,d.deptno,d.dname
from emp e,dept d
where e.deptno = d.deptno) s, emp_dept ed
where ed.empno(+) = s.empno;
emp_dept表中存放了emp,dept连接查询的部分结果。所以,s表包含了ed表中的所有内容
+放置的位置:哪面少哪面用+号,或者说哪面可能出现空记录,哪面用+号
oracle——外连接查询的更多相关文章
- 【学亮开讲】Oracle内外连接查询20181119
--内连接查询 --需求:查询显示业主编号.业主名称.业主类型名称 select os.id 业主编号,os.name 业主名称,ot.name 业主类型名称 from t_owners os,t_o ...
- SubSonic3.0使用外连接查询时查询不出数据的问题修改
今天在开发时,要使用到外连接查询,如图 老是查不出数据,所以就追踪了一下代码,发现查询后生成的SQL语句变成了内连接了,真是晕 然后继续Debug,发现原来SqlQuery类在调用LeftInnerJ ...
- oracle 外连接以及用on和where 的区别
Oracle 外连接(OUTER JOIN)包括以下: 左外连接(左边的表不加限制) 右外连接(右边的表不加限制) 全外连接(左右两表都不加限制) 对应SQL:LEFT/RIGHT/FULL OUT ...
- mysql——多表——外连接查询——左连接、右连接、复合条件查询
), d_id ), name ), age ), sex ), homeadd ) ); ,,,'nan','beijing'); ,,,'nv','hunan'); ,,,'nan','jiang ...
- mysql 内连接和外连接查询
一.内连接查询 (笛卡儿积) 内联接查询inner join,mysql可以简写为join 二.外连接查询 左外联接查询left outer join,mysql可以简写为left join右外联接查 ...
- oracle 内连接 外连接 查询 笔记
elect ename,job,sal from emp where deptno>10 order by sal desc; 联合查询,PK dept.deptno FK emp.deptno ...
- Oracle 外连接和 (+)号的用法
对于外连接,Oracle中可以使用“(+)”来表示,9i可以使用LEFT/RIGHT/FULL OUTER JOIN,下面将配合实例一一介绍.1. LEFT OUTER JOIN:左外关联 SELEC ...
- mysql常用基础操作语法(九)~~外连接查询【命令行模式】
1.左外连接left outer join或者left jion,outer可以省略不写,下边的右连接和全连接也一样: 左外连接的意思是,以left join左边的表中的数据为基准,即左边的表中有的必 ...
- Mysql学习总结(25)——MySQL外连接查询
1.左外连接left outer join或者left jion,outer可以省略不写,下边的右连接和全连接也一样: 左外连接的意思是,以left join左边的表中的数据为基准,即左边的表中有的必 ...
随机推荐
- 如何让R代码按计划执行
应用场景:你编写了R代码,每天对提交的数据进行分析,你希望它你吃饭的时候执行完毕,生成图表. 那么你需要安装taskscheduleR的包. 怎么操作,看帮助呗.
- (转)RabbitMQ消息队列(四):分发到多Consumer(Publish/Subscribe)
上篇文章中,我们把每个Message都是deliver到某个Consumer.在这篇文章中,我们将会将同一个Message deliver到多个Consumer中.这个模式也被成为 "pub ...
- Oracle11g使用exp导出空表
1.Oracle11g默认对空表不分配segment,故使用exp导出Oracle11g数据库时,空表不会导出. 2.设置deferred_segment_creation 参数为FALSE后,无论是 ...
- Codevs 2837 考前复习
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description Aiden马上要考试了,可他还没怎么复习,于是他 ...
- activiti搭建(二)与Spring集成
转载请注明源地址:http://www.cnblogs.com/lighten/p/5876773.html 本文主要讲解如何将Activiti和Spring框架集成,再过一段时间将会将一个基础的de ...
- 《搭建DNS负载均衡服务》RHEL6
搭建DNS负载均衡环境: 1.至少三台的linux虚拟机,一台主的DNS服务器,1台副的(可以N台),1台测试机. 负载均衡有很多种,apache那样的是为了缓解人们访问网站时给服务器造成太大的压力, ...
- Mysql多表查询(两张独立表,一张关系表)
一.数据库设计 1.三个数据表长这样 其中user表记录用户信息,cat主要记录男女性别,mete表是用户id和性别id的对应关系 2.具体数据如下 二.查询目标 查询出所有性别为“男”的 ...
- MAC上 nodejs express 安装
最近在MAC上搭建 nodejs环境以及安装 express 框架,遇到了一些问题,不过最后总算还是安装成功了,下面是操作步骤 1.node js 安装 访问nodejs官网进入下载mac上的安装包 ...
- Asp.net MVC Global.asax文件
global.asax文件概述 global.asax这个文件包含全局应用程序事件的事件处理程序.它响应应用程序级别和会话级别事件的代码. 运行时, Global.asax 将被编译成一个动态生成的 ...
- openerp学习笔记 视图更新时删除已存在的菜单或其他对象
删除菜单示例: <delete id="base.menu_module_updates" model="ir.ui.menu"/><dele ...