一般用with可以连接两个集合,但是递归有所不同,通常我们会改写成如下的错误代码:
with
report(id,org_name,org_level,parent_org,description)
as (select id,org_name,org_level,parent_org,description from ad_orgtb where id = '111111'
union all select b.id,b.org_name,b.org_level,b.parent_org,b.description from report a,ad_orgtb b where b.id = a.parent_org
)
, reportOne(id,org_name,org_level,parent_org,description)
as (select id,org_name,org_level,parent_org,description from ad_orgtb where id = '111111'
union all select bb.id,bb.org_name,bb.org_level,bb.parent_org,bb.description from reportOne aa,ad_orgtb bb where bb.parent_org = aa.id
)
select distinct id,org_name,org_level,parent_org,description from report,reportOne
正确的写法应该如下:
with report(id,org_name,org_level,parent_org,description)
as (select id,org_name,org_level,parent_org,description from ad_orgtb where id = '22222'
union all select b.id,b.org_name,b.org_level,b.parent_org,b.description from report a,ad_orgtb b where b.id = a.parent_org)
,report_result(id,org_name,org_level,parent_org,description)
as (
select distinct id,org_name,org_level,parent_org,description from report order by org_level,id
)
,reportOne(id,org_name,org_level,parent_org,description)
as (
select id,org_name,org_level,parent_org,description from ad_orgtb where id = '222222'
union all select b.id,b.org_name,b.org_level,b.parent_org,b.description from reportOne a,ad_orgtb b where b.parent_org = a.id
)
,reportOne_result(id,org_name,org_level,parent_org,description) as (
select distinct id,org_name,org_level,parent_org,description from reportOne order by org_level,id
)select distinct * from (
SELECT id,org_name,org_level,parent_org,description
from report_result
union all
select id,org_name,org_level,parent_org,description
from reportOne)t
要先将结果集取了,才能放置多个递归。