sql - 在 View 中使用递归 CTE

标签 sql sql-server recursion view common-table-expression

有一个典型的父/子层次结构表,使用 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/

相关文章:

sql - 准确查找文本

python - 使用点表示法扩展字典

javascript - 在javascript中的对象中设置具有未知深度的属性值

jquery - JPA - 仅选择当月第一天的对象

mysql - 我们什么时候使用_(下划线)进行sql select查询?

mysql - 每天列出每个类别中最畅销的商品,包括总销量和收入

mysql - SQL 加入多个条件

sql - 这个 SQL 查询的目的是什么以及如何发挥作用?

mysql - 删除所有旧条目

javascript - 对象构造函数和 TypeError 中的递归函数