根据最短约会

时间:2016-08-18 15:22:35

标签: sql sql-server stored-procedures aggregate

我能够找到类似的问题,但这并没有帮我解决!

我有一个包含作业数据(tablea)的表,架构如下:

CREATE TABLE [dbo].[tablea](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [JobNo] [varchar](32) NOT NULL,
    [JobDesc] [varchar](255) NULL,
    [RequiredDate] [datetime] NULL

此表中的某些作业为同一表中的其他作业提供组件,未来我将调用提供组件“生产作业”的作业和接收组件“子作业”的作业 - 表中没有任何内容链接行。

还有另一张表(tableb

CREATE TABLE [dbo].[tableb](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [JobNo] [varchar](32) NOT NULL CONSTRAINT [DF_JobProducts_JobNo]  DEFAULT (''),
    [SubJobNo] [varchar](32) NULL

这包含“生产作业”作业编号(tableb.JobNo),并在同一行中包含“子作业”的作业编号(tableb.SubJobNo

如果“生产作业”为7 x“子作业”提供组件,则表格中将有7行

我的目标是执行一个存储过程,该存储过程将使用相关“子作业的所需日期列的 EARLIEST 日期更新tablea的”生产作业“行的所需日期列”。执行存储过程时,将使用唯一标识符作为变量 - 这将是“生产作业”的标题。

我的尝试如下:

CREATE PROCEDURE [dbo].[UpdateDate] 
    @Title varchar(32),
AS
BEGIN
    SET NOCOUNT ON;

    UPDATE ta1
    SET ta1.RequiredDate = ta2.RequiredDate
    FROM tablea ta1
    INNER JOIN tableb tb ON ta1.JobNo = tb.JobNo
    INNER JOIN 
        (SELECT JobNo, MIN(RequiredTime) 
         GROUP BY JobNo 
         FROM tablea) ta2 ON tb.SubJobNo = ta2.JobNo
    WHERE ta1.JobDesc = @Title 

这让我感到难过,所以任何帮助或指示都会非常感激!

1 个答案:

答案 0 :(得分:2)

如果你想说tabalea与tableb有关,那么回到tablea以获得所需的时间然后只需将cte改为这样的东西:

CREATE PROCEDURE [dbo].[UpdateDate] 
    @Title varchar(32),
AS
BEGIN
    SET NOCOUNT ON;

    ;WITH cte AS (
       SELECT
          ta.JobNo
          ,MIN(ta2.RequiredTime) as NewRequiredDate
       FROM
          tablea ta
          INNER JOIN tableb tb
          ON ta.JobNo = tb.JobNo
          INNER JOIN tablea ta2
          ON tb.SubJobNo = ta2.JobNo
       WHERE
          ta.JobDesc = @Title
       GROUP BY
          ta.JobNo
    )

    UPDATE ta
    SET RequiredDate = c.NewRequiredDate
    FROM tablea ta
    INNER JOIN cte c
    ON ta.JobNo = c.JobNo