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 đủ
5
A
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
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.
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
- 1. Truy vấn tên đầy đủ ở Django
- 2. Cách nén thư mục không có đường dẫn đầy đủ
- 3. ASP.NET MVC - làm cách nào để có được đường dẫn đầy đủ đến một hành động
- 4. Tôi có thể nhận được truy vấn đầy đủ mà PreparedStatement sắp thực thi không?
- 5. Nhận đường dẫn tệp đầy đủ trong java
- 6. Cách lấy đường dẫn đầy đủ của StreamWriter
- 7. xây dựng tên đường dẫn đầy đủ trong python,
- 8. Đường dẫn đầy đủ từ đầu vào tệp bằng jQuery
- 9. Đường dẫn đầy đủ của cá tương tác Shell
- 10. mẫu log4net gì cung cấp cho tên tập tin mà không cần đường dẫn đầy đủ
- 11. Tìm tên tệp từ đường dẫn tệp đầy đủ
- 12. Đường dẫn đầy đủ của tệp Xcode 4
- 13. Tìm đường dẫn đầy đủ của trình thông dịch Python?
- 14. Nhận đường dẫn đầy đủ của các tệp trong PowerShell
- 15. Phân tích đường dẫn NSURL và truy vấn (iphoneOS)
- 16. ASP.NET - Cấp độ tin cậy = Đầy đủ?
- 17. Truy vấn phân cấp trong SQL Server 2005
- 18. Tìm phần thư mục (trừ tên tệp) của đường dẫn đầy đủ trong truy cập 97
- 19. Làm thế nào để có được đường dẫn đầy đủ cho một đối số dòng lệnh tên tập tin?
- 20. SQL transpose đầy đủ bảng
- 21. echo truy vấn joomla đầy đủ (với giới hạn vv)?
- 22. Làm cách nào để có được tên và họ của họ dưới dạng tên đầy đủ trong truy vấn MYSQL?
- 23. Làm cách nào để buộc Doxygen hiển thị đường dẫn đầy đủ?
- 24. Django-MPTT đường dẫn đầy đủ đến trang con làm thế nào để thực hiện?
- 25. Nhận đường dẫn đầy đủ để nộp trong khi gỡ lỗi bằng IIS Express
- 26. Cách ưa thích để có được đường dẫn máy chủ đầy đủ trong chế độ xem ASP.NET MVC là gì?
- 27. Làm thế nào để có được đường dẫn đầy đủ của tập tin từ một tập tin đầu vào
- 28. Làm thế nào để có được đường dẫn đầy đủ điều kiện cho một tập tin trong VBScript?
- 29. Trong linux, làm thế nào để có được đường dẫn đầy đủ của một lệnh tôi đang sử dụng?
- 30. Làm cách nào để chuyển đổi đường dẫn đầy đủ sang đường dẫn tương đối bằng cách sử dụng perl?
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 –