赞
踩
今天这个帖子要解决一个问题:oracle数据库表间通过left join关联超过2张表时,随着left join一路向左,永远只能是最左边的关联表与新表关联吗?还是母表可以一直on 下去?
利用sqlfiddle创建三张基本表结构先:
create table company(company_id int,company_name varchar2(10),department_id int,employee_id int);
create table department(department_id int,department_name varchar(10));
create table employee(employee_id int,employee_name varchar(10));
insert into company values(1,'HSBC',101,1001);
insert into department values(101,'IT');
insert into employee values(1001,'Steve');
select * from company;
select * from department;
select * from employee;
为了印证,我写下了如下代码:
select t1.*,t2.department_name,t3.employee_name
from company t1
left join department t2
on t1.department_id=t2.department_id
left join employee t3
on t1.employee_id=t3.employee_id;
结果是可以出来预想的结果的,也就是说left join是右边表向左join过程实际上是合并的过程,再继续left join新表的时候实际上是前面所有集合向新表抛出on. 随着left join一路向左,并非只能是最左边的关联表与新表关联,其实母表可以一直on 下去
另外,顺表解决一个疑问,left join关联的时候,左边表join on的字段value集大于右边表,拼合成的表如何取值?是保留左边所有value集,右边没有就为空吗?
譬如新增一条记录:
insert into company values(1,'HSBC',102,1001);
没错,left join关联的时候,左边表join on的字段value集大于右边表,拼合成的表是保留左边所有value集,右边没有就为空。
反之,left join关联的时候,左边表join on的字段value集小于右边表,拼合成的表如何取值?是只取左边所有value集,右边多出来的value集不取?
insert into employee values(1002,'Luke');
结论:反之,left join关联的时候,左边表join on的字段value集小于右边表,拼合成的表是只取左边所有value集,右边多出来的value集不取。
最后,借楼反馈下 left join /join /where连接表间关系的区别:
select t1.column,t2.column
from t1
left join t2
on
t1.indexno=t2.indexno;
这个意思是以右边表为主表,关联左边t2表,如果t2.indexno能有1个match则取这一行的t2.column,如果有超过1个match的,那么t1主表开始膨胀。如果0个match,那么t1.indexno依然出现在查询结果,只是t2.column出现null值;
join 则不然,
select t1.column,t2.column
from t1
join t2
on
t1.indexno=t2.indexno;
这个意思t1表和t2表相互关联,如果t2.indexno能有1个match则取这一行的t2.column,如果有超过1个match的,那么表开始膨胀。如果0个match,那么t1和t2取全集然后去掉空的记录;
where和join相同原理。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。