樹結構表遞迴查詢在ORACLE和MSSQL中的實現方法

iSQlServer發表於2009-05-13
樹結構表:記錄樹形資料的二維資料表,包含"本節點ID”和"父節點ID"
經常需要進行遞迴查詢某個節點下的所有節點資料
以下是分別在ORACLE和MSSQL中的實現

如本例子中涉及的表
TB_SM_ORGAN(
    ORG_ID int,
    ORG_CODE varchar(20),
    ORG_NAME varchar(40),
    IS_INITDATA char(1),
    ORG_PARENTID int,
    ORG_TYPEID varchar(6),
    ORG_AGENTID int,
    ORG_STATUS char(3),
    ORG_DESC varchar(200))

【ORACLE】
直接支援,使用SELECT * WHERE ..... START WITH ..... CONNECT BY 本節點ID=父節點ID
例如:
SELECT * FROM TB_SM_ORGAN where Org_Status = 'S0A' START WITH ORG_ID= @OrgId CONNECT BY PRIOR ORG_ID = ORG_PARENTID order by ORG_CODE

【MSSQL】
沒有增強型SQL實現,需要使用臨時表和迴圈多次查詢的方式實現
create function GetOrganSubTreeByOrganID (@id int)
returns @t table(
    ORG_ID int,
    ORG_CODE varchar(20),
    ORG_NAME varchar(40),
    IS_INITDATA char(1),
    ORG_PARENTID int,
    ORG_TYPEID varchar(6),
    ORG_AGENTID int,
    ORG_STATUS char(3),
    ORG_DESC varchar(200))
as
begin
    insert @t select * from TB_SM_ORGAN where org_id = @id
    while @@rowcount > 0
        insert @t select a.* from TB_SM_ORGAN as a inner join @t as b
        on a.org_parentid = b.org_id and a.org_id not in(select org_id from @t)
   return
end
使用方法

SELECT * FROM GetOrganSubTreeByOrganID (ID);

 出處: http://www.cnblogs.com/sunnyflat/articles/1173239.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-594979/,如需轉載,請註明出處,否則將追究法律責任。

相關文章