2013-04-23 34 views
6

Dữ liệu của tôi nằm trong bảng có 2 trường, Id & ParentId. Tôi lưu trữ dữ liệu với cấu trúc này (hình ảnh tương tự theo sau). Làm thế nào tôi có thể nhận được tất cả các đường dẫn từ lá đến gốc bao gồm Id = 6? (Mẫu Kết quả là ở sau)Nhận tất cả các cây từ bộ dữ liệu hàng (có id cụ thể) trong tsql

--Data structure is as follow : 
-- 1 
--/
--2 <- 3  9 
-- \ \ /
-- 4 <- 5 7 8 
-- \///
--  6 - - - 
-- / \ 
-- 10 <- 11 
--/
--12 

--Data In Table Is : 
--Id ParentId 
--1  null 
--2  1 
--3  2 
--4  2 
--5  3 
--5  4 
--6  4 
--6  5 
--6  7 
--6  8 
--7  9 
--8  null 
--9  null 
--10 6 
--11 6 
--11 10 
--12 10 

--Result for all trees that include "Id = 6": 
--12 > 10 > 6 > 4 > 2 > 1 
--12 > 10 > 6 > 5 > 4 > 2 > 1 
--12 > 10 > 6 > 5 > 3 > 2 > 1 
--12 > 10 > 6 > 7 > 9 
--12 > 10 > 6 > 8 
--11 > 10 > 6 > 4 > 2 > 1 
--11 > 10 > 6 > 5 > 4 > 2 > 1 
--11 > 10 > 6 > 5 > 3 > 2 > 1 
--11 > 10 > 6 > 7 > 9 
--11 > 10 > 6 > 8 
--11 > 6 > 4 > 2 > 1 
--11 > 6 > 5 > 4 > 2 > 1 
--11 > 6 > 5 > 3 > 2 > 1 
--11 > 6 > 7 > 9 
--11 > 6 > 8 

Trả lời

4

Bảng của bạn cho biết 4 có chính nó như một phụ huynh nhưng không phải bất cứ điều gì khác, nhưng bạn có một hàng nói rằng 12> 10> 6> 5> 4> 2> 1 vì vậy tôi không thể tạo ra kết quả tương tự với thiết lập.

sqlfiddle của tôi cho điều này là ở đây: http://sqlfiddle.com/#!6/873b9/3

Giả sử 4 đã 2 như mẹ mã của tôi trông như thế này (đặt hàng có thể là một chút khác nhau nhưng SQL của nó vì vậy nó ok):

WITH records as 
(
    SELECT 
    leaf.Id 
    ,leaf.ParentId 
    ,case when NOT EXISTS(SELECT * FROM recTest where ParentId = leaf.Id) then 1 else 0 end as isLeaf 
    FROM recTest as leaf 
) 
,hierarchy as 
(
    SELECT Id 
    ,NULL as ParentId 
    ,cast(Id as varchar(100)) as chain 
    ,isLeaf 
    FROM records 
    where ParentId IS NULL 
    UNION ALL 
    SELECT r.Id 
    ,r.ParentId 
    ,cast(cast(r.Id as varchar(100)) + ' > ' + h.chain as varchar(100)) as chain 
    ,r.isLeaf 
    FROM records as r 
    INNER JOIN hierarchy as h 
     ON r.ParentId = h.Id 
) 
SELECT 
h.chain 
FROM hierarchy as h 
WHERE isLeaf = 1 
AND h.chain like '%6%' 
OPTION (MAXRECURSION 0) 
1

Đối với một bảng như this sample table, kiểm tra truy vấn này:

with AllPossiblePath as(
SELECT distinct [descendant] leaf 
    ,(
     SELECT cast(f.dirname as nvarchar(64))+'/' 
     FROM filesystem f JOIN tree_path t 
     ON t.ancestor = f.id 
     WHERE t.descendant=t1.descendant for xml path('') 
    ) possiblePath 
    FROM [db1].[dbo].[tree_path] t1 
    where [descendant] not in(
    SELECT TOP 1000 ancestor 
    FROM [db1].[dbo].[tree_path] 
    where ancestor!=[descendant]) 
) 

select * from AllPossiblePath where possiblePath like '%Dir2%' 

Hope trợ giúp này!

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