2010-09-16 25 views
5

Tôi có một bảng có ba cột NodeId, ParentNodeId, NodeName. cho mỗi nút, tôi muốn có một đường dẫn đầy đủ như "lvl1/lvl2/lvl3 ..." trong đó lvl1, lvl2 và lvl3 là các tên nút. Tôi tìm thấy một chức năng thực hiện điều đó tại liên kết này http://www.sql-server-helper.com/functions/get-tree-path.aspx. nhưng tôi muốn sử dụng CTE HOẶC bất kỳ kỹ thuật nào khác cho hiệu quả. Xin vui lòng cho tôi biết nếu nó có thể đạt được điều này một cách tốt hơn. Cảm ơn trước.Truy vấn SQL để có được đường dẫn phân cấp đầy đủ

Trả lời

6

Đây là phiên bản CTE.

declare @MyTable table (
    NodeId int, 
    ParentNodeId int, 
    NodeName char(4) 
) 

insert into @MyTable 
    (NodeId, ParentNodeId, NodeName) 
    select 1, null, 'Lvl1' union all 
    select 2, 1, 'Lvl2' union all 
    select 3, 2, 'Lvl3' 

declare @MyPath varchar(100) 

;with cteLevels as (
    select t.NodeId, t.ParentNodeId, t.NodeName, 1 as level 
     from @MyTable t 
     where t.ParentNodeId is null 
    union all 
    select t.NodeId, t.ParentNodeId, t.NodeName, c.level+1 as level 
     from @MyTable t 
      inner join cteLevels c 
       on t.ParentNodeId = c.NodeId 
) 
select @MyPath = case when @MyPath is null then NodeName else @MyPath + '/' + NodeName end 
    from cteLevels 
    order by level 

select @MyPath 
+0

Bất kỳ cơ hội nào bạn có thể giúp tôi điều chỉnh câu trả lời này cho trường hợp của tôi? http://stackoverflow.com/q/5549480/93202 –

0

Cách hiệu quả nhất theo kinh nghiệm của tôi là thêm trường thừa, RootNodeID, chứa id của nút toplevel của cấu trúc treestructure. Vì vậy, bạn có thể truy vấn tất cả các nút trong toàn bộ cấu trúc tre một cách rất đơn giản và hiệu quả.

Và để xây dựng cấu trúc treestructure đó, một hàm đệ quy đơn giản trong ứng dụng của bạn sẽ hoạt động tốt.

Tôi biết đó là sự chuẩn hóa, và một số người không thực sự chấp nhận khái niệm này, nhưng tôi đã học được kinh nghiệm chuyên môn của mình rằng điều này mang lại hiệu suất rất lớn, trái với kịch bản t-sql phức tạp.

+0

u có thể cung cấp một ví dụ mã đơn giản cho việc này không? – RKP

+0

Bạn muốn ngôn ngữ nào? –

+0

SQL Server Transact SQL – RKP

4

Tôi đã giải quyết nó như thế này, tương tự như giải pháp của Joe.

with cte (NodeId,NodeName,hierarchyPath)as 
(
    select NodeId,NodeName, NodeName 
    from Node 
    where ParentNodeId is null 
    union all 
    select n.NodeId, n.NodeName, CONVERT(varchar(256), cte.hierarchyPath + '/' + n.NodeName) 
    from Node n 
    join cte on n.ParentNodeId = cte.NodeId 
) 

select * 
from cte 
order by NodeId 
Các vấn đề liên quan