程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL數據庫實現遞歸查詢的幾種代碼方法

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

編輯:關於SqlServer

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

    ProductCategory

    CategoryID,Level,ParentCategoryID

    數據

    1,1,-1

    2,1,-1

    3,2,1

    4,3,3

    5,2,2

    6,4,5

    T-SQL

    WITH CategoryTemp(CategoryID,ParentCategoryID)--臨時表用來保存查到的Category

    (

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

      UNION ALL--查詢N層

      SELECT pc.CategoryID,ParentCategoryID FROM ProductCategory pc

      LEFT JOIN CategoryTemp ct ON pc.ParentCategoryID=ct.CategoryID

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

    )

    SELECT CategoryID,ParentCategoryID FROM CategoryTemp

    結果

    1,-1

    2,-1

    3,1

    4,3

    5,2

    6,5

    如果把ParentCategoryID賦為2,結果則為

    5,2

    6,5

    實例

    ID 是否為部門   部門名   上級ID
    1       y                       部門0       1
    31     y                       部門1       1
    32     n                       張三         31
    33     n                       李二         31
    34     y                       部門2       31
    35     n                       王五         34
    35     y                       部門3 34
    36     n                       小三         35
    我想找詢   ID   值為   35   下級的所有人員包括下級部門的所有人員

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

    --調用函數進行查詢
    select   a.*   from   表   a   join   f_id(35)   b   on   a.id=b.id

    聯合查詢

    --測試數據
    create   table   表(ID   int,是否為部門   char(1),部門名   varchar(10),上級ID   int)
    insert   表   select   1   , 'y ', '部門0 '   ,1
    union   all   select   31, 'y ', '部門1 '   ,1
    union   all   select   32, 'n ', '張三 '   ,31
    union   all   select   33, 'n ', '李二 '   ,31
    union   all   select   34, 'y ', '部門2 ',31
    union   all   select   35, 'n ', '王五 '   ,34
    union   all   select   35, 'y ', '部門3 ',34
    union   all   select   36, 'n ', '小三 '   ,35
    go

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

    --調用函數進行查詢
    select   a.*   from   表   a   join   f_id(35)   b   on   a.id=b.id
    go

    --刪除測試
    drop   table   表
    drop   function   f_id

    /*--測試結果

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

    (所影響的行數為   1   行)

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved