根据另一个表 - MSSQL中的信息更新同一SQL表中的行

时间:2013-09-23 20:07:12

标签: sql sql-server tsql sql-server-2005

提前感谢您的帮助。

我有两个表,一个参考表和一个详细信息表。参考表列出了与下一步配对的订单的当前生产步骤,如下所示:

参考表

Current_Step      | Next_Step          |  ID
-------------------------------------------------
Step 1            | Step 2             | 1
Step 2            | Step 3             | 2
Step 3            | Step 4             | 3

我还有一个订单明细表:

Order_ID  | Step_ID  | Start_Date | Planned_End | Complete_Date | Planned_Duration
-----------------------------------------------------------------------------------
1000      | 1        | 1/1/2013   | 1/3/2013    | 1/3/2013      | 2
1000      | 2        |            |             |               | 3
1000      | 3        |            |             |               | 8

在此表中,订单的每个步骤都存在,但具有空白的开始日期和计划的结束日期。

我正在尝试构建一个查询:

  • 查找每个具有完整日期的项目
  • 找到与该项目相关联的Next_Step,用于表格
  • 中的相同Order_ID
  • 如果Start_Date为空,请将Start_Date更新为今天,并将Planned_Duration天添加到开始日期以计算Planned_End日期

我可以单独完成部分内容,但是我很难将它们整合到一个查询/存储过程中。

我很欣赏任何正确方向的指示。

再次感谢!

3 个答案:

答案 0 :(得分:0)

我会从这样的事情开始:

 select 
    n.orderId
 from
    refernce_table as r
    inner join order_details as p
        on r.current_step = p.step_id
    inner join order_details as n
        on r.next_step = n.step_id
 where 
     p.complete_date is not null
     and n.start_date is null

这为你提供了前面的步骤作为p和后续步骤n ..根据需要过滤它们

这里我说的是给我上一步完成的订单,下一步没有开始。我认为;)

答案 1 :(得分:0)

declare @Today datetime

select @Today = dateadd(dd, datediff(dd, 0, getdate()), 0)

update od2 set
    start_date = @Today,
    planned_end = dateadd(dd, od2.planned_duration, @Today)
from order_details as od
    inner join reference_table as rt on rt.current_step_id = od.step_id
    inner join order_details as od2 on od2.order_id = od.id and od2.step_id = rt.next_step_id
where
    od.complete_date = @Today and od2.start_date is null

答案 2 :(得分:0)

试试这个(对于SQL Server 2005):

UPDATE  n SET
        Start_Date =  CONVERT(VARCHAR, GETDATE(),112),
        Planned_end = DATEADD(dd, n.Planned_Duration,  CONVERT(VARCHAR, GETDATE(),112))
FROM    order_details AS d
JOIN    refernce_table AS r ON d.step_id= r.ID
JOIN    order_details AS n ON n.step_id = CONVERT(int, REPLACE(r.Next_Step, 'Step ',''))
AND     d.order_id = n.order_id
WHERE   d.Complete_Date =  CONVERT(VARCHAR, GETDATE(),112)
AND     N.Start_date is null;