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 ,期待相识的那天!