tsql

2013-04-23 10 views
6

में पंक्तियों के डेटा (विशिष्ट आईडी के साथ) से सभी पेड़ प्राप्त करें मेरा डेटा 2 फ़ील्ड, आईडी & अभिभावक के साथ तालिका में है। मैं इस संरचना के साथ डेटा स्टोर करता हूं (अनुसरण में इसी तरह की छवि)। मैं पत्ती से रूट तक सभी पथ कैसे प्राप्त कर सकता हूं जिसमें आईडी = 6 शामिल है? (परिणाम नमूना पालन में है)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 

उत्तर

4

आपकी तालिका कहती है कि 4 खुद को माता-पिता के रूप में है लेकिन कुछ भी नहीं, फिर भी आपके पास एक पंक्ति है जो 12> 10> 6> 5> 4> 2> 1 बताती है, इसलिए मैं उसी परिणाम का उत्पादन नहीं कर सकता सेट अप।

इस के लिए मेरे sqlfiddle यहाँ है: http://sqlfiddle.com/#!6/873b9/3

मानते हुए 4 2 अभिभावक के रूप में मेरे कोड इस तरह दिखता है (आदेश तो यह ठीक है थोड़ा अलग है, लेकिन इसके एसक्यूएल हो सकता है):

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

this sample table की तरह एक मेज के लिए, इस प्रश्न की जाँच करें:

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%' 

आशा इस मदद!