SQL 語句技巧--遞歸查詢機構和下屬機構的用戶數


SQL 語句技巧--遞歸查詢機構和下屬機構的用戶數

     今天,一個同事說有個查詢比較復雜,需求是:查詢機構下的用戶數(包括下面全部機構用戶),同時還要統計下屬機構的用戶數。

 

     業務要求:要統計總公司下的用戶,還要統計總公司下屬的全部機構(技術部,分公司等)的用戶數,

                  同時還要統計技術部,這時統計技術部的用戶,還可能包含技術一部,技術二部,技術三部,可能技術一部下面還包含測試部等等部門的用戶

                  依此類推,統計下面的技術一部,和技術一部下面的測試部

 

     同事說這樣的話要在程序里遞歸查詢全部機構,就可以得到結果,要寫很多條sql語句,能不能用一條sql查詢出來。

 

     后來自己試着用一個SQL語句統計出各個機構(包含下屬機構)的用戶數據,在SQL server 2005里有CTE實現遞歸查詢。但只能查詢一級的數據,如查詢總公司的可以,但下面個部門,各個子公司就不好查詢了總數了。而且在一條sql語句實現遞歸不太可能,這時考慮一下,發現用表值函數來實現,結合Cross apply來查詢其下屬機構的用戶數。以下是實現T_SQL代碼:

  表值函數:

復制代碼
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--   =============================================
--  Author:  鄭平
--  Create date: 2008年8月26日11: 14 : 15
--  Description: 返回機構下面的全部機構(包含本機構)
--   =============================================
CREATE FUNCTION subOrgs
(
  @orgid varchar(
32 )
)
RETURNS @tab table(id varchar(
32 ))
AS
BEGIN  
 ;
 with org(orgid)
 
as
 ( 
    select a.oid  from  orgunitlink a
   
where  a.pid = @orgid
   union all
    select c.oid 
   from orgunitlink c inner join org aa
   on aa.orgid
= c.pid
 )
  insert into @tab select orgid from org union select @orgid
  RETURN 
END
GO
復制代碼
 

--查詢sql 

復制代碼
select t.objname,sum(y.num) num,t.id  from 
(select b.objname,count(
* ) num,b.id  from humres a inner join
orgunit b on a.orgid
= b.id 
inner join orgunitlink c on c.oid
= b.id   where  a.isdelete = 0  and
a.workstatus
<> ' 402881ea0b1c751a010b1cd2ae770008 '
group by b.objname,b.id,c.pid)t
 CROSS APPLY  subOrgs(id) f 
inner join 
(select b.objname,count(
* ) num,b.id  from humres a inner join
orgunit b on a.orgid
= b.id 
inner join orgunitlink c on c.oid
= b.id  where  a.isdelete = 0  and 
a.workstatus
<> ' 402881ea0b1c751a010b1cd2ae770008 '
group by b.objname,b.id,c.pid)
 y on y.id
= f.id  group by t.objname,t.id order by  2  desc
復制代碼


 

 

     以上查詢的速度很快,而且不使用遞歸查詢數據庫,是一個比較好的解決辦法,下面是查詢結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM