熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> MySQL >> 正文

SQL數據庫實現遞歸查詢的幾種代碼方法

2013-11-23 21:05:29  來源: MySQL 

  SQL數據庫實現遞歸查詢的幾種代碼方法
表結構

  ProductCategory

  CategoryIDLevelParentCategoryID

  數據

  

  

  

  

  

  

  TSQL

  WITH CategoryTemp(CategoryIDParentCategoryID)臨時表用來保存查到的Category

  (

  SELECT CategoryIDParentCategoryID FROM ProductCategory WHERE ParentCategoryID<=將所有的第一層查出來作為初始數據需要查第幾層或者哪個ParentCategoryID下面所有的 N層把ParentCategoryID賦相關的值即可

  UNION ALL查詢N層

  SELECT pcCategoryIDParentCategoryID FROM ProductCategory pc

  LEFT JOIN CategoryTemp ct ON pcParentCategoryID=ctCategoryID

  WHERE ParentCategoryID>因為第一層前面已經查出來了所以這裡把第一層篩選掉

  )

  SELECT CategoryIDParentCategoryID FROM CategoryTemp

  結果

  

  

  

  

  

  

  如果把ParentCategoryID賦為結果則為

  

  

  實例

  ID 是否為部門   部門名   上級ID
       y                       部門      
     y                       部門      
     n                       張三        
     n                       李二        
     y                       部門      
     n                       王五        
     y                       部門3 
     n                       小三        
我想找詢   ID   值為      下級的所有人員包括下級部門的所有人員

  創建查詢函數
create   function   f_id(
@id   int 要查詢的id
)returns   @re   table(id   intlevel   int)
as
begin
declare   @l   int
set   @l=
insert   @re   select   id@l
from   表  
where   上級id=@id
while   @@rowcount>
begin
set   @l=@l+
insert   @re   select   aid@l
from   表   a   join   @re   b   on   a上級id=bid   and   blevel=@l
end
return
end
go

  調用函數進行查詢
select   a*   from   表   a   join   f_id()   b   on   aid=bid

  聯合查詢

  測試數據
create   table   表(ID   int是否為部門   char()部門名   varchar()上級ID   int)
insert   表   select      y 部門   
union   all   select   y 部門   
union   all   select   n 張三   
union   all   select   n 李二   
union   all   select   y 部門
union   all   select   n 王五   
union   all   select   y 部門
union   all   select   n 小三   
go

  創建查詢函數
create   function   f_id(
@id   int 要查詢的id
)returns   @re   table(id   intlevel   int)
as
begin
declare   @l   int
set   @l=
insert   @re   select   id@l
from   表  
where   上級id=@id
while   @@rowcount>
begin
set   @l=@l+
insert   @re   select   aid@l
from   表   a   join   @re   b   on   a上級id=bid   and   blevel=@l
end
return
end
go

  調用函數進行查詢
select   a*   from   表   a   join   f_id()   b   on   aid=bid
go

  刪除測試
drop   table   表
drop   function   f_id

  /*測試結果

  ID                     是否為部門   部門名                 上級ID                
           
                     n           小三                  

  (所影響的行數為      行)


From:http://tw.wingwit.com/Article/program/MySQL/201311/29557.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.