2013-05-22 36 views
1

有描述對象層次和他們類型的表:帶過濾器的MSSQL CTE樹如何?

DECLARE @TTable TABLE 
(
ID int 
,Higher int -- for some reason this is how ID_PARENT named 
,[Type] int 
) 

,我需要選擇與分支僅包含的某些[類型]節點的子樹。

;WITH c 
AS 
(
SELECT 
    ID 
    ,Higher 
    ,[Type] 
FROM 
    dbo.EnObj 
WHERE Type = 40 

UNION ALL 

SELECT 
    t.ID 
    ,t.Higher 
    ,t.Type 
FROM 
    dbo.EnObj T 
INNER JOIN c ON t.ID = c.Higher 
) 

然後選擇唯一的記錄到表變量:

因爲我在SQL是一個初學者一般和CTE我首先找到所有包含某種類型的對象從底部到頂部的樹枝這樣做
INSERT @TTable 
SELECT DISTINCT 
c.ID 
,c.Higher 
,c.Type 
,c.Name 
,c.Voltage 
FROM c 

然後通過內置的熱膨脹係數與層次結構從頂部排序,以底部:

;WITH CTE AS (
    SELECT 
    ID 
    ,Higher 
    ,[Type] 
,CAST(ID AS VARCHAR(128)) AS Sort 
FROM  
    @TTable 
WHERE 
    Higher IS NULL 
UNION ALL 
SELECT 
    N.ID 
    ,N.Higher 
    ,N.[Type] 
    ,CAST(P.Sort + '/' + CAST(N.ID AS VARCHAR) AS VARCHAR(128)) 
FROM  
    @TTable N 
INNER JOIN CTE AS P ON P.ID = N.Higher 
) 
SELECT 
    ID 
    ,Higher 
    ,[Type] 
    ,Sort 
FROM CTE 
ORDER BY Sort 

它的工作原理,但我不知道是否有優化這個查詢的方式,就像使用一個CTE我而不是兩個或在CTE中有一個過濾器。

+0

我認爲最後的查詢是相當不錯的。 – Devart

+0

所有方面都轉到這個人:[link](http://beyondrelational.com/modules/2/blogs/28/posts/10486/recursive-cte-and-ordering-of-the-hierarchical-result.aspx) – user1699353

+0

你想獲得特定[Id]下某個[類型]的層次結構嗎?或者所有可能的具有某種[類型]的樹? –

回答

1
with Hierachy 
as 
(
    select ID, Higher, Type from EnObj 
     WHERE Type = 40 -- Whatever your search criteria 

     union all 
    select EnObj.ID, EnObj.Higher ,EnObj.Type from EnObj  
    inner join Hierachy 
    on tblOrgLevel.Higher = Hierachy.ID 
) 
select * from Hierachy --where ID <> 40 

另一種解決方案

WITH DirectReports 
AS 
(
    SELECT parentid, id, Title, 0 AS EmployeeLevel 
    FROM dbo.tblOrgLevel 
    WHERE ISNULL(parentid ,0) = 0 and FKAgencyID = 58 
    UNION ALL 
    SELECT e.parentid, e.id, e.Title, EmployeeLevel + 1 
    FROM dbo.tblOrgLevel AS e 
     INNER JOIN DirectReports AS d 
     ON e.parentid= d.id 
) 
SELECT * 
FROM DirectReports 
ORDER BY parentid; 
GO 

你可以問我更多的澄清,以及一些修改