简体   繁体   English

如何为 SQL Server 编写这个递归 CTE?

[英]How to write this recursive CTE for SQL Server?

For simplicity my schema:为简单起见,我的架构:

  1. Folders table (FolderId, ParentFolderId)文件夹表(FolderId、ParentFolderId)

  2. DeviceFolderProperties table (FolderId, LogDataRetentionDaysEvent) DeviceFolderProperties 表(FolderId、LogDataRetentionDaysEvent)

Not every folder has a retention day.并非每个文件夹都有保留日。 However this is an inherited value.然而,这是一个继承的价值。 How can you write something in SQL to return every folder and its retention day and if that is null its inherited value.你怎么能用 SQL 写一些东西来返回每个文件夹及其保留日期,如果它为空,它的继承值。

There are multiple levels to inheritance, so it will need to walk the tree.继承有多个级别,因此需要遍历树。

This is what I have tried:这是我尝试过的:

;
WITH [cte]
AS 
(
    SELECT f.FolderId, f.ParentFolderId, dfp.LogDataRetentionDaysEvent
    FROM [Folders] f
    LEFT JOIN DeviceFolderProperties dfp
    ON f.FolderId = dfp.FolderId
), 
[cte_collapse] 
AS --recurse where r days is null
(

    SELECT c.FolderId, c.ParentFolderId, c.LogDataRetentionDaysEvent
    FROM [cte] c
    WHERE c.LogDataRetentionDaysEvent IS NULL

    UNION ALL

    SELECT c.FolderId, c.ParentFolderId, ISNULL(c.LogDataRetentionDaysEvent, cc.LogDataRetentionDaysEvent)
    FROM [cte] c
    JOIN [cte_collapse] cc ON cc.FolderId = c.ParentFolderId

)
SELECT
    *
FROM 
    [cte_collapse]

You could write this as:你可以这样写:

with 
    data as (
        select f.FolderID, f.ParentFolderId, dfp.LogDataRetentionDaysEvent
        from Folders f
        left join DeviceFolderProperties dfp on dfp.FolderID = f.FolderID
    ),
    cte as (
        select d.*, FolderID OriginalFolderId
        from data d
        union all
        select d.*, c.OriginalFolderId
        from cte c
        inner join data d on d.FolderID = c.ParentFolderId
        where c.LogDataRetentionDaysEvent is null
    )
select OriginalFolderId, max(LogDataRetentionDaysEvent) LogDataRetentionDaysEvent
from cte 
group by OriginalFolderId

We start by generating a derived table that contains information from both tables.我们首先生成一个派生表,其中包含来自两个表的信息。 Then, for each record, the recursive query climbs up the hierarchy, searching for a non-null the retention at each level.然后,对于每条记录,递归查询爬上层次结构,在每个级别搜索非空的保留。 The trick is to stop as soon as a match is met.诀窍是在遇到比赛时立即停止。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM