在完成编写递归 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