Idのparentidを取得したい場合、そのparentidが再びそれを取得した場合などになります。階層テーブルの種類。
id----parentid
1-----1
5-----1
47894--5
47897--47894
sQL Serverを初めて使用し、次のようなクエリを試しました。
with name_tree as
(
select id, parentid
from Users
where id = 47897 -- this is the starting point you want in your recursion
union all
select c.id, c.parentid
from users c
join name_tree p on p.id = c.parentid -- this is the recursion
)
select *
from name_tree;
それは私に1行だけを与えています。また、これらのレコードを一時テーブル変数に挿入します。これどうやってするの。前もって感謝します。簡単な質問をしてすみません(私には違いますが)
これを試して、子供のすべての親を取得します
;with name_tree as
(
select id, parentid
from Users
where id = 47897 -- this is the starting point you want in your recursion
union all
select C.id, C.parentid
from Users c
join name_tree p on C.id = P.parentid -- this is the recursion
-- Since your parent id is not NULL the recursion will happen continously.
-- For that we apply the condition C.id<>C.parentid
AND C.id<>C.parentid
)
-- Here you can insert directly to a temp table without CREATE TABLE synthax
select *
INTO #TEMP
from name_tree
OPTION (MAXRECURSION 0)
SELECT * FROM #TEMP
ここをクリック 結果を表示するには
編集:
テーブル変数に挿入したい場合、次のようなことができます:
-- Declare table varialbe
Declare @TABLEVAR table (id int ,parentid int)
;with name_tree as
(
select id, parentid
from #Users
where id = 47897 -- this is the starting point you want in your recursion
union all
select C.id, C.parentid
from #Users c
join name_tree p on C.id = P.parentid -- this is the recursion
-- Since your parent id is not NULL the recursion will happen continously.
-- For that we apply the condition C.id<>C.parentid
AND C.id<>C.parentid
)
-- Here you can insert directly to table variable
INSERT INTO @TABLEVAR
select *
from name_tree
OPTION (MAXRECURSION 0)
SELECT * FROM @TABLEVAR
ここをクリック 結果を表示するには
クエリは再帰を行っていますが、反対方向です。したがって、開始点を次のように変更すると:
where id = 1
その後、ユーザーは1
と彼の後継者全員
目的の出力と入力については言及しませんでした。しかし、あなたはこのように試すことができます、
Declare @t table (id int ,parentid int)
insert into @t
select 1,1 union all
select 5,1 union all
select 47894,5 union all
select 47897,47894
;With CTE as
(
select * from @t where id=1
union all
Select a.* from @t a inner join cte b
on b.id=a.parentid and
a.id<>b.id
)
select * from cte