有一个典型的父/子层次结构表,使用 Common Table Expression 查询它是很常见的事情:
with CTE as (
select Id, ProviderId, ConsumerId
from T1
where ProviderId in (2, 3, 9)
union all
select T1.Id, T1.ProviderId, T1.ConsumerId
from T1
join CTE on C.ProviderId = CTE.ConsumerId
)
select * from CTE
是否可以基于此查询创建一个 View ,以便可以执行以下操作:
select * from MagicView where ProviderId in (2,3,9)
换句话说,我们能否以某种方式从 CTE 的 anchor 部分提取参数来创建通用 View ?
最佳答案
创建一个 TVF:
CREATE FUNCTION my_function (
@ProviderId int
)
RETURNS @ProviderTable TABLE
(
Id int NULL,
ProviderId int NULL,
ConsumerId int NULL
)
AS
BEGIN
WITH cte AS (
SELECT Id,
ProviderId,
ConsumerId
FROM T1
WHERE ProviderId in (@ProviderId)
UNION ALL
SELECT t.Id,
t.ProviderId,
t.ConsumerId
FROM T1 t
INNER JOIN cte c
ON t.ProviderId = c.ConsumerId
)
INSERT INTO @ProviderTable
SELECT * FROM cte;
RETURN;
END;
创建一个 View :
CREATE VIEW my_view
AS
SELECT m.*
FROM Providers p
CROSS APPLY my_function (p.ProviderId) m
之后你可以从 View 中选择你需要的任何东西:
SELECT *
FROM my_view
WHERE ProviderId in (2,3,9)
OPTION (MAXRECURSION 0)
关于sql - 在 View 中使用递归 CTE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37886502/