0

データのあるテーブルがあります

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

mgtIdはidを参照します。CTEを使用して非リーフノード(joe、jack、paul)を選択するにはどうすればよいですか。

4

3 に答える 3

1
select *
from table
where id in (select mgtId from table)
于 2012-04-24T21:11:18.140 に答える
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

2012年4月25日更新

上記のクエリをテストすると、動作し、ルートノードも返されます。

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

結果:

id name    mgtId id 
-- ------- ----- -- 
1  joe     null  1  
2  jack    1     2  
4  paul    2     4  
于 2012-04-24T21:12:53.127 に答える
0

cte as(select id、mgtId from mgr_emp)select b.id、b.name、b.mgtId、a.mgtId from cte a right join mgr_emp b on b.mgtId = a.id

于 2012-04-25T05:10:27.737 に答える