Oracle的多个join的区别

来源:互联网 发布:python spark安装 编辑:程序博客网 时间:2024/06/05 17:58

1.栏位合并
left join、right join、inner join、full join
left join(左联接): 返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右联接): 返回包括右表中的所有记录和左表中联结字段相等的记录
inner join(等值连接): 只返回两个表中联结字段相等的行
FULL JOIN :关键字会从左表 (Persons) 和右表 (Orders) 那里返回所有的行。

 

例子一:人员表和订单表的关联
create table Persons(
Id_P varchar2(10),
 LastName varchar2(20),
 FirstName varchar2(20),
 Address varchar2(50),
 City varchar2(50)) ;
 
 
create table  Orders(
Id_O varchar2(10),
 OrderNo varchar2(10),
  Id_P varchar2(10));
 
 
 
  select * from Persons for update;
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

 
  select * from Orders for update;
1 77895 3
2 44678 3
3 22456 1
4 24562 1
5 34764 65

--left join   返回左Persons表中的所有记录和右表orders中联结字段相等的记录连接
  select a.*,b.* from Persons a
  left join orders b on a.id_p=b.id_p;
 
--inner join 返回两个表中联结字段相等的行
  select a.*,b.* from Persons a
  inner join orders b on a.id_p=b.id_p;
--等价于
select a.*,b.* from Persons a,orders b where a.id_p=b.id_p;
   
 
--right join 返回包括右表orders中的所有记录和左表Persons中联结字段相等的记录
  select a.*,b.* from Persons a
  right join orders b on a.id_p=b.id_p;
 
---full join 如果 "Persons" 中的行在表 "Orders" 中没有匹配,或者如果 "Orders" 中的行在表 "Persons" 中没有匹配,这些行同样会列出。
--也就是当两个表ID相同时合并为一笔,ID不同时,也同样显示。
  select a.*,b.* from Persons a
  full join orders b on a.id_p=b.id_p;
   
 
  --join等价于inner join
select a.*,b.* from Persons a
join orders b on a.id_p=b.id_p;
 

例子二;稽核与影像数据匹配的统计结果
select * from (
select  data_month,count(deal_state)  完全匹配 from
source_image_data_list
where deal_state=1
group by data_month) a
join
(
select  data_month,count(deal_state) 部分匹配 from
source_image_data_list
where deal_state=2
group by data_month)b
on a.data_month=b.data_month
order by a.data_month;

原创粉丝点击