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

求一SQL,大家帮帮忙
首先是一个企业表 取名 org吧 然后组织有个字段 联系人 Linkman, 组织名orgname , 组织号,orgid ,上级组织号 parentorgid 企业里面至少有三层结构,就是有 总企业,分企业,部门 吧 
再有一员工表 取名 emp吧 然后 有字段 empid , orgid 
还有一设备表 取名 equ吧 然后 有字段 equid ,orgid
他们之间的关系 不说也是orgid了 但都是直属于某一层组织 不能属于上一层组织

现在求一SQL是 select 组织名 联系人 员工人数 设备数 要求,根据条件选择的组织列出该组织及其下属组织的组织信息
比如 如果选择某一分企业,就把该分企业和他的下属部门列出来,并且求该分企业的总人数和总设备数和下属各部门的人数和设备数 ,如果选择 总企业就把该总企业和下属分企业列出来 ,并列出详细信息

希望我讲的清楚了,求各位高手帮忙

------解决方案--------------------
如果选择总企业,不需要列下属分企业的下属部门吧?

--建立临时表,存储各组织直属的员工数和设备数(不建立临时表也可以,只要不嫌写一个大SQL太长)
create table temp1 t as
select o.Linkman,
o.orgid,
o.orgname,
o.parentorgid,
nvl(t1.emp_count),
nvl(t2.equ_count)
from org o,
(select o1.orgid, count(*) as emp_count
from org o1, emp e1
where o1.orgid = e1.orgid) t1,
(select o2.orgid, count(*) as equ_count
from org o2, equ e2
where o2.orgid = e2.orgid) t2
 where o.orgid = t1.orgid(+)
and o.orgid = t2.orgid(+)
 group by o.Linkman, o.orgid, o.orgname, o.parentorgid;

select t1.orgname, t1.Linkman, t1.emp_count, t1.equ_count
from temp1 t1
 where t1.orgid = 组织ID
union
select t2.orgname, t2.Linkman, t2.emp_count, t2.equ_count
from temp1 t2
 where t2.parentorgid = 组织ID;
------解决方案--------------------
探讨

引用:
如果选择总企业,不需要列下属分企业的下属部门吧?

--建立临时表,存储各组织直属的员工数和设备数(不建立临时表也可以,只要不嫌写一个大SQL太长)
create table temp1 t as
select o.Linkman,
o.orgid,
o.orgname,
o.parentorgid,
nvl(t1.emp_coun……

------解决方案--------------------
一 数据量少直接 connect by start with 所求节点

二 数据量多分层聚合 grouping sets((高级,中级,低级),(高级,中级),(高级))