ニーズを満たすために再帰 CTE クエリを作成するという大変な作業を行った後、インデックス付きビューでは機能しないため、使用できないことに気付きました。したがって、以下の CTE を置き換えるために何か他のものが必要です。(はい、インデックスのないビューで CTE を使用できますが、それは私には遅すぎます)。
要求事項:
私の最終的な目標は、自己更新のインデックス付きビューを作成することです (ビューである必要はありませんが、似たようなものです)。つまり、ビューが結合するテーブルのいずれかでデータが変更された場合、ビューは自体を更新します。
ビューは非常に高速である必要があり、データは頻繁に変更されないため、インデックスを作成する必要があります。残念ながら、CTE を使用したインデックスなしのビューの実行には 3 ~ 5 秒かかり、私のニーズには長すぎます。クエリをミリ秒単位で実行する必要があります。再帰テーブルには数十万のレコードがあります。
私の調査によると、これらすべての要件を満たす最善の解決策はインデックス付きビューですが、私はどのような解決策も受け入れます。
CTE は、私の他の投稿への回答にあります。またはここに再びあります:
DECLARE @tbl TABLE (
Id INT
,[Name] VARCHAR(20)
,ParentId INT
)
INSERT INTO @tbl( Id, Name, ParentId )
VALUES
(1, 'Europe', NULL)
,(2, 'Asia', NULL)
,(3, 'Germany', 1)
,(4, 'UK', 1)
,(5, 'China', 2)
,(6, 'India', 2)
,(7, 'Scotland', 4)
,(8, 'Edinburgh', 7)
,(9, 'Leith', 8)
;
DECLARE @tbl2 table (id int, abbreviation varchar(10), tbl_id int)
INSERT INTO @tbl2( Id, Abbreviation, tbl_id )
VALUES
(100, 'EU', 1)
,(101, 'AS', 2)
,(102, 'DE', 3)
,(103, 'CN', 5)
;WITH abbr AS (
SELECT a.*, isnull(b.abbreviation,'') abbreviation
FROM @tbl a
left join @tbl2 b on a.Id = b.tbl_id
), abcd AS (
-- anchor
SELECT id, [Name], ParentID,
CAST(([Name]) AS VARCHAR(1000)) [Path],
cast(abbreviation as varchar(max)) abbreviation
FROM abbr
WHERE ParentId IS NULL
UNION ALL
--recursive member
SELECT t.id, t.[Name], t.ParentID,
CAST((a.path + '/' + t.Name) AS VARCHAR(1000)) [Path],
isnull(nullif(t.abbreviation,'')+',', '') + a.abbreviation
FROM abbr AS t
JOIN abcd AS a
ON t.ParentId = a.id
)
SELECT *, [Path] + ':' + abbreviation
FROM abcd