一、问题描述

  有时我们为了保留某个表中的数据,而该表中的数据在另外一个关联表中未必都存在对应,此时就应该试用外连接查询。

  比如:两个表,产品表和子产品表

注:子产品的parent_product_id便是产品表的id

  产品可以有子产品,也可以没有子产品

  遇到类似的问题需要使用外连接查询,保证所有的产品被查询出来,而其对应的子产品也在查询结果中。

二、问题解决

  1.基础概念

    笛卡尔积:例如,A={a,b}, B={0,1,2},则

         A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}
         B×A={(0, a), (0, b), (1, a), (1, b), (2, a), (2, b)}

    即,一个集合在左和在右做“笛卡尔积”结果是不同的。

  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——外连接查询的更多相关文章

  1. 【学亮开讲】Oracle内外连接查询20181119

    --内连接查询 --需求:查询显示业主编号.业主名称.业主类型名称 select os.id 业主编号,os.name 业主名称,ot.name 业主类型名称 from t_owners os,t_o ...

  2. SubSonic3.0使用外连接查询时查询不出数据的问题修改

    今天在开发时,要使用到外连接查询,如图 老是查不出数据,所以就追踪了一下代码,发现查询后生成的SQL语句变成了内连接了,真是晕 然后继续Debug,发现原来SqlQuery类在调用LeftInnerJ ...

  3. oracle 外连接以及用on和where 的区别

    Oracle  外连接(OUTER JOIN)包括以下: 左外连接(左边的表不加限制) 右外连接(右边的表不加限制) 全外连接(左右两表都不加限制) 对应SQL:LEFT/RIGHT/FULL OUT ...

  4. mysql——多表——外连接查询——左连接、右连接、复合条件查询

    ), d_id ), name ), age ), sex ), homeadd ) ); ,,,'nan','beijing'); ,,,'nv','hunan'); ,,,'nan','jiang ...

  5. mysql 内连接和外连接查询

    一.内连接查询 (笛卡儿积) 内联接查询inner join,mysql可以简写为join 二.外连接查询 左外联接查询left outer join,mysql可以简写为left join右外联接查 ...

  6. oracle 内连接 外连接 查询 笔记

    elect ename,job,sal from emp where deptno>10 order by sal desc; 联合查询,PK dept.deptno FK emp.deptno ...

  7. Oracle 外连接和 (+)号的用法

    对于外连接,Oracle中可以使用“(+)”来表示,9i可以使用LEFT/RIGHT/FULL OUTER JOIN,下面将配合实例一一介绍.1. LEFT OUTER JOIN:左外关联 SELEC ...

  8. mysql常用基础操作语法(九)~~外连接查询【命令行模式】

    1.左外连接left outer join或者left jion,outer可以省略不写,下边的右连接和全连接也一样: 左外连接的意思是,以left join左边的表中的数据为基准,即左边的表中有的必 ...

  9. Mysql学习总结(25)——MySQL外连接查询

    1.左外连接left outer join或者left jion,outer可以省略不写,下边的右连接和全连接也一样: 左外连接的意思是,以left join左边的表中的数据为基准,即左边的表中有的必 ...

随机推荐

  1. C#中如何查找Dictionary中的重复值

    简介 在这篇帮助文档中,我将向你展示如何实现c#里字典中重复值的查找.你知道的对于一个老鸟来说,这是非常简单的代码.但是尽管如此,这也是一篇对c#初学者非常有用的帮助文档. 背景 多数程序员对小型数据 ...

  2. dropdownlist值改变时调用js

    DropDownList的OnSelectedIndexChanged方法是服务器端方法如要用需要设置AutoPostBack选项为true,并且在服务器后台写方法 要调用js方法需要onchange ...

  3. 20141030--SQL2008常用命令-1

    create database biao2--创建新的数据库 go use biao2 go create table shuiguo--创建表shuiguo ,create table创建表 ( 序 ...

  4. OC5_Block

    // // main.m // OC5_Block // // Created by zhangxueming on 15/6/26. // Copyright (c) 2015年 zhangxuem ...

  5. 单一职责原则(SRP)

    一个类应仅有一个引起它变化的原因. 内聚性. 每个Responsibility都是变化的一个轴线.当需求变化时,该变化会反映为类的职责的变化 当一个类耦合了多个职责时,一个职责的变化会消弱或抑制其他职 ...

  6. ubuntu 12.04 安装 codeblock 12.11

      原文地址:http://qtlinux.blog.51cto.com/3052744/1136779 参考文章:http://blog.csdn.net/dszsy1990/article/det ...

  7. 如何给xml应用样式

    引子:可扩展标记语言xml(Extensible Markup Language)自己平常也用到的不多,除了在ajax处理服务器返回的数据可能会用到外(不过一般用json处理数据的比较常见)还真没怎么 ...

  8. Toad for Oracle 快捷键

    F4 看表的结构 F5 执行对话框中的SQL,注意最后需要以;结尾 F7 清除当前编辑框中所有的sql F8 查看历史的sql语句 F9 执行当前行的sql F10 看菜单 Ctrl + F12 保存 ...

  9. 《Linux系统静态路由和火墙路由》

    本篇主要写的是关于静态路由表的添加,和如何让你不能上网的主机通过火墙路由表实现上网的功能. 静态路由表: 要是你的主机是2块网卡,并且做了网卡的绑定,依照我下面的方法是成功不了的,你可以去编辑: # ...

  10. Ubuntu搜狗输入法的使用

    下载搜狗拼音输入法安装包 删除ibus,确认没有以ibus开头的包存在 sudo dpkg -P ibus ibus-gtk ibus-gtk3 ibus-pinyin ibus-pinyin-db- ...