【发布时间】:2011-04-22 21:49:42
【问题描述】:
鉴于这两个表:
[dbo].[Task]
[Id] [Duration] [ScheduledStart]
int int Nullable DateTime
[dbo].[TaskDependencies]
[Id] [PredecessorTaskId] [TaskId]
int FK_Task_Id FK_Task_Id
我正在尝试查找任务直接前任的最新结束日期。对于 Task 表,ScheduledStart 可以为空。这背后的想法是,如果它没有明确的计划开始,它可以从其前辈派生(根级任务必须有一个 ScheduledStart,因此计算可以从某个地方开始)。任务也可以有多个前置任务。
我想出了一个假递归函数(我认为)它可以满足我的需求。我想知道是否有更有效的方法可以在 SQL 中编写它,因为我习惯于更多的过程编程。我应该让 Function_A 成为一个存储过程并让它自己调用吗?有没有一种方法可以通过 WITH 语句来完成(那些是更有效的递归查询方式,还是像这样的递归函数)?
DateTime Function_A(Task)
{
var predecessorList = getPredecessors(Task)
var latestEndDate;
var currentPredecessorLatestEndDate;
ForEach(Predecessor in predecessorList)
{
if(Predecessor.ScheduledStart != null)
{
if(latestEndDate != null)
{
if(Predecessor.StartDate + Predecessor.Duration > latestEndDate)
{
latestEndDate = Predecessor.StartDate + Predecessor.Duration;
}
}
else
{
latestEndDate = Predecessor.StartDate + Predecessor.Duration;
}
}
else
{
currentPredecessorLatestEndDate = Function_A(Predecessor.Id);
if(latestEndDate != null)
{
if(currentPredecessorEndDate > latestEndDate)
{
latestEndDate = currentPredecessorEndDate;
}
}
else
{
latestEndDate = currentPredecessorEndDate;
}
}
}
return latestEndDate;
}
感谢您的帮助!
【问题讨论】:
标签: sql sql-server-2005 tsql recursion