日期:2014-05-17  浏览次数:20910 次

Oracle 数据库连接杂记
/*
数据表的连接有: 
1、内连接(自然连接): 只有两个表相匹配的行才能在结果集中出现 
2、外连接: 包括 
(1)左外连接(左边的表不加限制) 
(2)右外连接(右边的表不加限制) 
(3)全外连接(左右两表都不加限制) 
3、自连接(连接发生在一张基表内) 
*/
--左连接1 无论b表中有没有得到匹配的时间,左边的a表的数据都会显示出来
select a.*, nvl(b.prd_quantity, 0) as prd_quantity
  from som_ptm_detail a
  left join (select som_ptm_detail_id,
  sum(nvl(prd_quantity, 0)) prd_quantity
  from prd_order
  group by som_ptm_detail_id) b
  on a.keyid = b.som_ptm_detail_id
 where (nvl(a.ord_number, 0) + nvl(a.bakup_storage, 0) - nvl(a.storage, 0) +
  nvl(a.gift_quantity, 0)) > nvl(b.prd_quantity, 0)
 order by a.serial_no;
 
 --左连接2 无论b表中有没有得到匹配的时间,左边的a表的数据都会显示出来
 --"(+)"所在位置的另一侧为连接的方向
 --左连接说明等号左侧的所有记录均会被显示,无论其在右侧是否得到匹配。
  select a.*, nvl(b.prd_quantity, 0) as prd_quantity
  from som_ptm_detail a
  , (select som_ptm_detail_id,
  sum(nvl(prd_quantity, 0)) prd_quantity
  from prd_order
  group by som_ptm_detail_id) b
  where a.keyid = b.som_ptm_detail_id(+)
 and (nvl(a.ord_number, 0) + nvl(a.bakup_storage, 0) - nvl(a.storage, 0) +
  nvl(a.gift_quantity, 0)) > nvl(b.prd_quantity, 0)
  order by a.serial_no;
  
  --右连接 无论a表有没有匹配的数据,b表的数据都显示出来
  --"(+)"所在位置的另一侧为连接的方向
  --右连接说明等号右侧的所有记录均会被显示,无论其在左侧是否得到匹配。
  select a.*, nvl(b.prd_quantity, 0) as prd_quantity
  from som_ptm_detail a
  , (select som_ptm_detail_id,
  sum(nvl(prd_quantity, 0)) prd_quantity
  from prd_order
  group by som_ptm_detail_id) b
  where a.keyid(+) = b.som_ptm_detail_id
 and (nvl(a.ord_number, 0) + nvl(a.bakup_storage, 0) - nvl(a.storage, 0) +
  nvl(a.gift_quantity, 0)) > nvl(b.prd_quantity, 0)
  order by a.serial_no;
  
  --右连接2 
  select a.*, nvl(b.prd_quantity, 0) as prd_quantity
  from som_ptm_detail a
  right join (select som_ptm_detail_id,
  sum(nvl(prd_quantity, 0)) prd_quantity
  from prd_order
  group by som_ptm_detail_id) b
  on a.keyid = b.som_ptm_detail_id
 where (nvl(a.ord_number, 0) + nvl(a.bakup_storage, 0) - nvl(a.storage, 0) +
  nvl(a.gift_quantity, 0)) > nvl(b.prd_quantity, 0)
  order by a.serial_no;
 
 --内连接(自然连接): 只有两个表相匹配的行才能在结果集中出现
 select a.*, nvl(b.prd_quantity, 0) as prd_quantity
  from som_ptm_detail a
  , (select som_ptm_detail_id,
  sum(nvl(prd_quantity, 0)) prd_quantity
  from prd_order
  group by som_ptm_detail_id) b
  where a.keyid = b.som_ptm_detail_id
 and (nvl(a.ord_number, 0) + nvl(a.bakup_storage, 0) - nvl(a.storage, 0) +
  nvl(a.gift_quantity, 0)) > nvl(b.prd_quantity, 0)
 order by a.serial_no;


------解决方案--------------------
我整理了下 结构是这样的:
1 内连接
1.1等值连接(自然连接)
1.2不等值连接
2 外连接
2.1左外连接
2.1右外连接
2.3全外连接
3 交叉连接


自连接是按连接表涉及的数量来分的
------解决方案--------------------
兄弟,哥顶你,未来的DBA ,期待相识的那天!