left join 多表关联原理

这个是我再别人那里拿的数据,还有他的问题

现在有 A,B,C,D四张表,A为主表,B、C、D都是子表,与A属于一对多关系。查询后出现大量重复数据

表A
-----------------------------------------------
cID                      Name
1                          张三
2                          李四

表B
-----------------------------------------------
cID                      Car
1                          本田飞度
1                          POLO

表C
-----------------------------------------------
cID                      Credit
1                          广发信用卡
1                          兴业信用卡
1                          民生信用卡

表D
-----------------------------------------------
cID                      Hose
1                          怡海花园14号楼201
1                          富锦家园7号楼702

查询语句

SELECT * FROM A LEFT JOIN B ON (A.cID = B.cID)  LEFT JOIN C ON (A.cID = C.cID)  LEFT JOIN D ON (A.cID = D.cID)

查询结果为

cID                  Name                   Car                      Credit                      Hose
1                      张三                      本田飞度             广发信用卡             怡海花园14号楼201
1                      张三                      本田飞度             广发信用卡             富锦家园7号楼702
1                      张三                      本田飞度             兴业信用卡             怡海花园14号楼201
1                      张三                      本田飞度             兴业信用卡             富锦家园7号楼702
1                      张三                      本田飞度             民生信用卡             怡海花园14号楼201
1                      张三                      本田飞度             民生信用卡             富锦家园7号楼702
1                      张三                       POLO                 广发信用卡             怡海花园14号楼201
1                      张三                       POLO                 广发信用卡             富锦家园7号楼702
1                      张三                       POLO                 兴业信用卡             怡海花园14号楼201
1                      张三                       POLO                 兴业信用卡             富锦家园7号楼702
1                      张三                       POLO                 民生信用卡             怡海花园14号楼201
1                      张三                       POLO                 民生信用卡             富锦家园7号楼702

我最终想实现的效果为:
cID                  Name                   Car                      Credit                      Hose
1                      张三                      本田飞度             广发信用卡             怡海花园14号楼201
                                                      POLO                  兴业信用卡             富锦家园7号楼702
                                                                                   民生信用卡       

我来推一下为什么会得到上面的数据

首先、AB表关联,得到一下数据:

cID        Name        Car
1           张三           本田
1           张三           polo

然后,关联C表,mysql会将AB结果集做为一个整体,关联C,因为(A.cID = C.cID),从数据来看肯定满足,AB数据集的第一条,匹配了C表的3条数据,第二条也匹配了三条数据,然后就是

cID                  Name                   Car                      Credit
1                      张三                      本田                    广发信用卡
1                      张三                      本田                    兴业信用卡
1                      张三                      本田                    民生信用卡
1                      张三                      POLO                    广发信用卡
1                      张三                      POLO                    兴业信用卡
1                      张三                      POLO                    民生信用卡

再然后,ABC结果集关联D,分别是ABC结果的1,2,3,4,5,6,匹配两条房屋数据,得到以上的最后结果。

原文地址:https://www.cnblogs.com/longsanshi/p/11381404.html

时间: 2024-10-30 09:55:20

left join 多表关联原理的相关文章

Oracle数据库,join多表关联方式、union结果集合并

join on :   多表关联 内连接 :与其他表连接 from 表1 t join 表2 s on t.字段1 =s.字段2 join 表3 n on n.字段3=t.字段1 或 from 表1 a ,表2 b,表3c where a.字段=b.字段 自连接: 与自身连接 from 表1 t join 表1 s on t.字段1 =s.字段1 s.字段1=t.字段1 外连接:左/右连接 left join on 左连接 保证左边表的数据全部显示 right join on 右连接 保证右边表

Oracle-left join两表关联只取B表匹配到的第一条记录

背景:  A表.B表两表关联,关联出来的结果里B表有不止一条,需求是只要B表结果中的某一条(按某字段排序) 经过百度,发现 row_number() over(partition by a order by b desc)函数可用(需要说明下,order by 必须有缺少会报错),以下是数据环境及结果. 创建数据环境 create table A(ANAME varchar(20)); insert into A values('alan'); insert into A values('Ale

Yii2中多表关联查询(with、join、joinwith)

表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order         (id  order_name   customer_id   book_id) 图书表Book          (id  book_name    author_id) 作者表Author        (id  author_name) 模型定义 下面是这4个个模型的定义,只写出其中的关联 Customer class Customer ex

Yii2中多表关联查询(join、joinwith) with是不执行sql的

Yii2中多表关联查询(join.joinwith) 我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_name customer_id book_id) 图书表 (id book_name author_id) 作者表 (id author_name) 模型定义 下面是这4个个模型的定义,只写出其中的关联 Customer class Customer extends \

Yii2中多表关联查询(join、joinwith)

我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order          (id  order_name       customer_id   book_id) 图书表                    (id  book_name       author_id) 作者表                    (id  author_name) 模型定义 下面是这4个个模型的定义,只写

Hive中小表与大表关联(join)的性能分析【转】

Hive中小表与大表关联(join)的性能分析 [转自:http://blog.sina.com.cn/s/blog_6ff05a2c01016j7n.html] 经常看到一些Hive优化的建议中说当小表与大表做关联时,把小表写在前面,这样可以使Hive的关联速度更快,提到的原因都是说因为小表可以先放到内存中,然后大表的每条记录再去内存中检测,最终完成关联查询.这样的原因看似合理,但是仔细推敲,又站不住脚跟. 多小的表算小表?如果所谓的小表在内存中放不下怎么办?我用2个只有几条记录的表做关联查询

Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)(转)

我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order          (id  order_name       customer_id   book_id) 图书表                    (id  book_name       author_id) 作者表                    (id  author_name) 模型定义 下面是这4个个模型的定义,只写

20亿与20亿表关联优化方法(超级大表与超级大表join优化方法)

记得5年前遇到一个SQL.就是一个简单的两表关联.SQL跑了几乎相同一天一夜,这两个表都非常巨大.每一个表都有几十个G.数据量每一个表有20多亿,表的字段也特别多. 相信大家也知道SQL慢在哪里了,单个进程的PGA 是绝对放不下几十个G的数据,这就会导致消耗大量temp tablespace,SQL慢就是慢在temp来回来回来回...的读写数据. 遇到这样的超级大表与超级大表怎么优化呢?这篇文章将告诉你答案. 首先创建2个測试表 t1,t2 数据来自dba_objects create tabl

Oracle两表关联(join)更新字段值一张表到另一张表

[采用视图更新的方式] 有需求A表,B表,需要将B表中的name字段更新到A表中的name,两表有id关联,代码如下: update  (select a.name aname, b.name bname from A a, B b where a.id = b.id) set aname = bname; --注:两表关联属性id必须为unique index或primary key