22

私はこのような構造を持っています:

<Unit>
  <SubUnit1>
           <SubSubUnit1/>
           <SubSubUnit2/>
           ...
           <SubSubUnitN/>
  </SubUnit1/>
  <SubUnit2>
           <SubSubUnit1/>
           <SubSubUnit2/>
           ...
           <SubSubUnitN/>
  </SubUnit2/>
  ...
  <SubUnitN>
           <SubSubUnit1/>
           <SubSubUnit2/>
           ...
           <SubSubUnitN/>
  </SubUnitN/>
</Unit>

この構造には、メイン ユニット、サブユニット、サブサブユニットの 3 つのレベルがあります。

UnitId ですべての子を選択したい。
ユニットで検索すると、すべてのツリーを取得する必要があります。
SubUnit1 で検索すると、SubUnit1 と SubUnit1 のすべての子を取得する必要があります。
SubSubUnit2 を検索すると、それ自体を取得する必要があります。

これが私の試みです:

with a(id, parentid, name)
as (
select id, parentId, name
   from customer a
   where parentId is null 
union all
   select a.id, a.parentid, a.Name
   from customer
     inner join a on customer.parentId = customer.id
    )
select parentid, id, name 
from customer pod
where pod.parentid in (
select id
from customer grbs
where grbs.parentid in (
select id
from customer t
where t.parentid = @UnitId
))
union 
select parentid, id, name
from customer grbs
where grbs.parentid in (
select id
from customer t
where t.parentid = @UnitId
)
union
select parentid, id, name
from customer c
where c.Id = @UnitId
order by parentid, id

私は3つのユニオンワードを使用しています。うまくいきませんが、機能します。ケース構造には N レベルがありますが、正しい結果を得るにはどうすればよいですか?

4

2 に答える 2

48
DECLARE @Id int = your_UnitId
;WITH cte AS 
 (
  SELECT a.Id, a.parentId, a.name
  FROM customer a
  WHERE Id = @Id
  UNION ALL
  SELECT a.Id, a.parentid, a.Name
  FROM customer a JOIN cte c ON a.parentId = c.id
  )
  SELECT parentId, Id, name
  FROM cte

SQLFiddle のデモ

于 2012-12-14T15:27:56.157 に答える