2012-04-24 10 views
0

すべて私がデータ戻りMS SQLでの再帰CTEを使用して、非リーフノード

id  name  mgtId 
-------------------------- 
1  joe   null 
2  jack   1 
3  jill   1 
4  paul   2 
5  ron   4 
6  sam   2 

を持つテーブルを持っているが参照IDをmgtId。 CTEを使用して、非葉ノード(​​joe、jack、paul)を選択するにはどうすればよいですか。

+0

なぜあなたは再帰的ソリューションを必要としますか? –

答えて

1
select * 
from table 
where id in (select mgtId from table) 
+0

私は思っていません... – therealmitchconnors

+0

ルートノードを選択しません – Naveen

+0

あなたがリクエストしたのと同じように、このクエリはjoe、jack、paulを選択します。 – therealmitchconnors

1

一つの方法:

;with parents_id as (
    select distinct mgtId as id 
    from your_table 
) 
select * 
from your_table t 
inner join parants_id p on t.id = p.id 
25 aprl 2012

を更新し

私はtest above queryに来て、それが動作しても、ルートノードを返します。

select * 
into #your_table 
from (
select 1 as id, 'joe' as name, null as mgtId union all 
select 2,  'jack ',  1 union all 
select 3,  'jill ' ,  1 union all 
select 4,  'paul ' ,  2 union all 
select 5,  'ron ' ,  4 union all 
select 6,  'sam' ,  2 ) T 


;with parents_id as (
    select distinct mgtId as id 
    from #your_table 
) 
select * 
from #your_table t 
inner join parents_id p on t.id = p.id 

結果:

(mgr_emp から選択ID、mgtId)としてCTE 選択b.id、b.name有する
id name mgtId id 
-- ------- ----- -- 
1 joe  null 1 
2 jack 1  2 
4 paul 2  4 
+0

ルートノード(joe)は選択されません。 – Naveen

+0

本当ですか?私は両方のチェックがあり、ルートノードは結果に含まれています。更新されたコメントを参照してください。 – danihp

+0

申し訳ありませんが、ソリューションは機能します。私は間違った例をフレームに入れました。テーブルにはリンクされていないノードも含まれていて、それらのノードも選択する必要があります – Naveen

0

、b.mgtId、右に B mgr_empに参加CTEからa.mgtId b.mgtId = A .id