2012-12-13 35 views
12

Tôi có cấu trúc như thế này:

Làm thế nào để có được tất cả con cái của cha mẹ và con cái của họ sau đó sử dụng đệ quy trong truy vấn

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

Cấu trúc này có 3 mức độ: chính Unit, tiểu đơn vị và SubSubUnits.

Tôi muốn chọn tất cả trẻ em theo UnitId.
Nếu tôi tìm kiếm theo đơn vị, tôi phải lấy tất cả cây.
Nếu tôi tìm kiếm theo SubUnit1, tôi phải nhận SubUnit1 và tất cả các con của SubUnit1.
Nếu tôi tìm kiếm SubSubUnit2, tôi phải tự lấy.

Đây là cố gắng của tôi:

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 

tôi sử dụng 3 công đoàn-từ, nó không phải là tốt nhưng nó hoạt động. Cấu trúc trường hợp sẽ có N cấp độ, làm thế nào tôi có được kết quả chính xác?

+0

Hãy xem câu trả lời này: http://stackoverflow.com/questions/317322/optimized-sql-for-tree-structures – twoleggedhorse

Trả lời

18
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 

Demo trên SQLFiddle

+0

Nó hoạt động! cảm ơn bạn! – user1893999

+0

Cảm ơn. Mã này hoạt động. – Datta

Các vấn đề liên quan