SQL - 从分层设置值 Children

SQL - Setting Value From Hierarchical Children

我正在编写一个应用程序,它从项目计划 MS SQL table 中获取任务数据(我们称之为 table tasks)。为简单起见,可以将 table 字段视为如下:

task_id, parent_id, name, start_date, end_date

所有 parent 任务的开始日期和结束日期均为 NULL。只有 children(没有自己的 children)有开始和结束日期。

我想获取任务数据并在此过程中根据所有 parent 的 children 和递归的最早开始日期设置每个 parent 的开始日期grandchildren 并将结束日期设置为所有 children 和递归 grandchildren 的最晚结束日期。请问这样可以吗?

根据您的问题,我假设您使用 Sql Server。我想这就是你想要的。它是用递归的通用 table 表达式完成的。它从叶子 children 开始,一直到最顶层 parents:

DECLARE @t TABLE(id INT, pid INT, sd DATE, ed DATE)

INSERT INTO @t VALUES
(1, NULL, NULL, NULL),
(2, 1, NULL, NULL),
(3, 2, '20150201', '20150215'),
(4, 2, '20150101', '20150201'),
(5, 1, NULL, NULL),
(6, 5, '20150301', '20150401'),
(7, 1, NULL, NULL),
(8, 7, NULL, NULL),
(9, 8, '20140101', '20141230'),
(10, 8, '20140102', '20141231')

;WITH cte AS(
SELECT * FROM @t WHERE sd IS NOT NULL

UNION ALL

SELECT t.id, t.pid, c.sd, c.ed FROM @t t
JOIN cte c ON c.pid = t.id
)

SELECT id, pid, MIN(sd) AS sd, MAX(ed) AS ed 
FROM cte
GROUP BY id, pid
ORDER BY id

输出:

id  pid   sd            ed
1   NULL  2014-01-01    2015-04-01
2   1     2015-01-01    2015-02-15
3   2     2015-02-01    2015-02-15
4   2     2015-01-01    2015-02-01
5   1     2015-03-01    2015-04-01
6   5     2015-03-01    2015-04-01
7   1     2014-01-01    2014-12-31
8   7     2014-01-01    2014-12-31
9   8     2014-01-01    2014-12-30
10  8     2014-01-02    2014-12-31