1

オブジェクトの階層とそのタイプを説明する表があります。

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

特定の [タイプ] のノードのみを含むブランチを持つサブツリーを選択する必要があります。私は一般的にSQLとCTEの初心者なので、最初に特定のタイプのオブジェクトを含むすべてのブランチを下から上に見つけてこれを行いました。

;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
)

次に、一意のレコードを選択してテーブル変数に入れます。

INSERT @TTable
SELECT DISTINCT
c.ID
,c.Higher
,c.Type
,c.Name
,c.Voltage
FROM  c

次に、上から下に並べ替えて CTE による階層を構築します。

;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

動作しますが、2 つではなく 1 つの CTE を使用するか、CTE にフィルターを使用するなど、このクエリを最適化する方法があるかどうか疑問に思います。

4

1 に答える 1

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

あなたは私にもっと明確にし、いくつかの修正を求めることができます

于 2013-09-20T14:45:10.477 に答える