[轉(zhuǎn)]樹結(jié)構(gòu)表遞歸查詢在ORACLE和MSSQL中的實現(xiàn)方法
樹結(jié)構(gòu)表:記錄樹形數(shù)據(jù)的二維數(shù)據(jù)表,包含"本節(jié)點ID”和"父節(jié)點ID"
經(jīng)常需要進行遞歸查詢某個節(jié)點下的所有節(jié)點數(shù)據(jù)
以下是分別在ORACLE和MSSQL中的實現(xiàn)
如本例子中涉及的表
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 本節(jié)點ID=父節(jié)點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實現(xiàn),需要使用臨時表和循環(huán)多次查詢的方式實現(xiàn)
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
使用方法
經(jīng)常需要進行遞歸查詢某個節(jié)點下的所有節(jié)點數(shù)據(jù)
以下是分別在ORACLE和MSSQL中的實現(xiàn)
如本例子中涉及的表
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 本節(jié)點ID=父節(jié)點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實現(xiàn),需要使用臨時表和循環(huán)多次查詢的方式實現(xiàn)
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.rzrgm.cn/sunnyflat/articles/1173239.html
浙公網(wǎng)安備 33010602011771號