Sql server Sql Server递归父/子表使用相同字段
我需要从同一张桌子上得到父母和所有孩子 运行此查询时:Sql server Sql Server递归父/子表使用相同字段,sql-server,recursion,parent,Sql Server,Recursion,Parent,我需要从同一张桌子上得到父母和所有孩子 运行此查询时: select location, children from lochierarchy where parent ='HSAGCF' 这一结果: Location Children -------- ------------ HSAGCFSMF 1 HSAGEE 1 HSAGGAI 0 HSAGPO 1 HSAGSA 1 HSAGSACC 1 HSAGSAFR 0 HSA
select location, children from lochierarchy where parent ='HSAGCF'
这一结果:
Location Children
-------- ------------
HSAGCFSMF 1
HSAGEE 1
HSAGGAI 0
HSAGPO 1
HSAGSA 1
HSAGSACC 1
HSAGSAFR 0
HSAGSARV 0
HSAGSASG 0
HSAGSC 1
HSAGSD 1
HSAGSI 1
HSAGSO 1
HSAGSR 0
HSAGST 0
HSAGSTTO 0
当位置有子对象=1时,层次结构中有更多子对象
如何执行递归操作,在children=1的位置上获取该查询的每个位置,然后再次按如下方式运行该查询:
select location
from lochierarchy
where parent in ( 'HSAGCFSMF', 'HSAGEE', 'HSAGGAI', 'HSAGPO', 'HSAGSA',
'HSAGSACC','HSAGSAFR', 'HSAGSARV', 'HSAGSASG', 'HSAGSC',
'HSAGSD', 'HSAGSI', 'HSAGSO', 'HSAGSR', 'HSAGST',
'HSAGSTTO', 'HSAGSV', 'HSAGU1', 'HSAGU2', 'HSAGU3', 'HSAGU4')
locations Children
---------- ------------
HSAGCFSMF 1
HSAGEE 1
HSAGGAI 0
HSAGPO 1
HSAGSA 1
HSAGSACC 1
HSAGSAFR 0
HSAGSARV 0
HSAGSASG 0
HSAGSC 1
HSAGSD 1
HSAGSI 1
HSAGSO 1
HSAGSR 0
HSAGST 0
HSAGSTTO 0
HSAGSV 0
declare @parent varchar(20) = 'HSAGCF';
with cte as (
select location, parent
from lochierarchy
where location = @parent
union all
select c.location, c.parent
from lochierarchy as c
join cte as p
on c.parent = p.location
)
select *
from cte;
需要重复此递归,直到所有位置的子位置都为0。如果使用SQL 2005或更高版本,则可以使用递归公共表表达式。大概是这样的:
select location
from lochierarchy
where parent in ( 'HSAGCFSMF', 'HSAGEE', 'HSAGGAI', 'HSAGPO', 'HSAGSA',
'HSAGSACC','HSAGSAFR', 'HSAGSARV', 'HSAGSASG', 'HSAGSC',
'HSAGSD', 'HSAGSI', 'HSAGSO', 'HSAGSR', 'HSAGST',
'HSAGSTTO', 'HSAGSV', 'HSAGU1', 'HSAGU2', 'HSAGU3', 'HSAGU4')
locations Children
---------- ------------
HSAGCFSMF 1
HSAGEE 1
HSAGGAI 0
HSAGPO 1
HSAGSA 1
HSAGSACC 1
HSAGSAFR 0
HSAGSARV 0
HSAGSASG 0
HSAGSC 1
HSAGSD 1
HSAGSI 1
HSAGSO 1
HSAGSR 0
HSAGST 0
HSAGSTTO 0
HSAGSV 0
declare @parent varchar(20) = 'HSAGCF';
with cte as (
select location, parent
from lochierarchy
where location = @parent
union all
select c.location, c.parent
from lochierarchy as c
join cte as p
on c.parent = p.location
)
select *
from cte;
如果您想要树中叶节点的路径,我将此作为练习留给读者。现在您的问题还不够清楚。它没有解释父项和子项之间的链接是什么(除了0,1字段)。是位置字段的字母吗?或者别的什么?请更好地解释一下。@JorgeCampos:是的,只是没有明确说明。查看OP最初运行的查询:
select location,children from lochierarchy where parent='HSAGCF'
。这意味着有一个父列包含当前行的父列。哦,你是对的@BenThul,谢谢。