オブジェクトの階層とそのタイプを説明する表があります。
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 にフィルターを使用するなど、このクエリを最適化する方法があるかどうか疑問に思います。