2016-08-18 81 views
-1

我已经能够找到类似的问题,我有一个,但没有帮助我解决!存储过程基于最小日期更新列

我有一个包含作业数据表(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

NB如果“生产作业”提供组件7ד子作业”会有TableB中7×行

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

我尝试如下:

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 

这让我难住了,所以任何帮助或指针将不胜感激!

+0

什么是你尝试去错了吗?您是否收到特定的错误讯息?它是否更新错误的数据?请具体说明。 –

+0

嗨,罗伯特。它更新日期,但它似乎与第一个“子工作”日期 - 不是最早的日期。 – user6731224

回答

0

如果你想说,tabalea涉及到TABLEB然后回到表A以获得所需的时间,然后就在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 
+0

嗨马特,感谢您的帮助 - 是的,我正在尝试从tablea> tableb>表a。使用第二个代码,我收到以下错误: – user6731224

+0

列'ta.JobNo'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。 – user6731224

+0

对不起,我只是试图给你一个方向,而忽略了小组。我把它放进去了,但想法是使用一个CTE来像你通常在select中那样进行聚合,然后连接来更新你的原始表。 – Matt