SQL Server:使用另一个表中的多个记录的第一个实例更新表行

时间:2018-02-18 22:00:47

标签: sql sql-server

我有两张桌子。表A&表B。 TableB已经有数据行,但需要使用TableA中的信息进行更新,但每个表中唯一匹配的信息不会标识特定行,只能标识一组行。他们看起来像这样:

TableA
StartTime                InstanceID  WorkCode  JobNumber  WorkCenter
=======================  ==========  ========  =========  ==========
2018-02-16 18:37:13.000  728282      103       725863     155
2018-02-17 00:54:12.000  728265      106       725863     155
2018-02-16 22:12:03.000  728110      103       725863     155

TableB
StartTime                InstanceID  WorkCode  JobNumber  WorkCenter
=======================  ==========  ========  =========  ==========
2018-02-16 18:39:53.000  NULL        NULL      725863     155
2018-02-17 00:52:18.000  NULL        NULL      725863     155
2018-02-16 22:08:26.000  NULL        NULL      725863     155

在上面的示例中,这两个表几乎同时插入,但不完全正如您在时间戳中看到的那样。唯一真正匹配的信息是JobNumber和WorkCenter。我需要一种方法来匹配它们,所以我可以在TableB上使用TableA中缺少的信息进行UPDATE。

我认为可以做到的唯一方法是使用StartTime对TableB进行排序,并通过循环执行某种UPDATE,其中TableA也必须按StartTime排序。然后,TableA中的第一个实例将匹配TableB中的第一个实例并将更新,然后是第二个记录/实例,第三个,第四个等等。

任何专业人士都必须先解决这个问题,然而将它们联系起来的唯一方法就是按顺序进行处理?创建临时表是否有助于创建一个带编号的列并以此方式链接?

请记住,这些表在JobNumber和WorkCenter列中有许多不同的值,因此我还需要使用WHERE子句过滤。

1 个答案:

答案 0 :(得分:0)

您可以使用row_number()执行此操作。幸运的是,SQL Server允许更新中的子查询(此类):

update b
    set instanceId = a.instanceId,
        workCode = a.workCode
from (select b.*,
             row_number() over (partition by jobNumber, WorkCenter order by starttime) as seqnum
      from tableb b
     ) b join
     (select a.*,
             row_number() over (partition by jobNumber, WorkCenter order by starttime) as seqnum
      from tablea a
     ) a
     on b.jobNumber = a.jobNumber and b.workCenter = a.workCenter and
        b.seqnum = a.seqnum;

我会在更新后确认所有内容都是正确的顺序。在tableB您需要的地方找不到正确的信息是一件痛苦的事。根据时间可以导致。 。 。我应该说,失望。