如何解决如何为SQL Server编写此递归CTE?
为简单起见,我的架构:
-
文件夹表(FolderId,ParentFolderId)
-
DeviceFolderProperties表(FolderId,LogDataRetentionDaysEvent)
并非每个文件夹都有保留日期。但是,这是一个继承的值。如何用SQL写一些东西来返回每个文件夹及其保留日期,如果该日期为null,则返回其继承值。
继承有多个层次,因此需要遍历树。
这是我尝试过的:
;
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,ISNULL(c.LogDataRetentionDaysEvent,cc.LogDataRetentionDaysEvent)
FROM [cte] c
JOIN [cte_collapse] cc ON cc.FolderId = c.ParentFolderId
)
SELECT
*
FROM
[cte_collapse]
解决方法
您可以这样写:
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
我们首先生成一个派生表,该表包含两个表中的信息。然后,对于每个记录,递归查询将爬升到层次结构,在每个级别上搜索非null的保留。诀窍是在比赛结束后立即停止。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。