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表中的所有内容
+放置的位置:哪面少哪面用+号,或者说哪面可能出现空记录,哪面用+号
最新文章
- 一枚招聘信息——分期乐招页面重构/UI开发(8k-12k 深圳 经验1-3年 学历不限 全职)
- Django+Tastypie作后端,Backbone作前端的TodoMVC
- JavaScript DOM 编程艺术·setInterval与setTimeout的动画实现解析
- Linux三剑客之sed
- Kali Linux渗透测试实战 1.2 环境安装及初始化
- C# async
- [ACM_水题] Yet Another Story of Rock-paper-scissors [超水 剪刀石头布]
- [转]ionic 通过PouchDB + SQLite来实现app的本地存储(Local Storage)
- Shell练习 行列转换
- Java Servlet的request使用的编码引发的思考 以及解决方法
- django Modelform
- Android 开发笔记___SQLite__基本用法
- Kafka集群安装部署、Kafka生产者、Kafka消费者
- zookeeper kafka集群
- openwrt页面显示问题修改
- Dubbo原理解析-Dubbo内核实现之SPI简单介绍
- Task任务的屏障机制
- Netbeans rcp中获得本地文件系统路径
- Daily record-July
- (求凹包) Bicycle Race (CF 659D) 简单题
热门文章
- iOS数据持久化(二)SQLite
- python基础:自定义函数
- VKP5 Price Calculation – List Variant &; KZPBL (Delete site level)
- 躲避球游戏ios源码
- 使用 Time Machine 恢复 .ssh等隐藏文件夹
- DTCMS列表页自定义参数。
- mysql删除、修改字段默认值
- Laravel 5 基础(三)- 向视图传送数据(续)
- How to enables AX email functionality without Outlook
- MySQL监控工具-orzdba