我有两张桌子。表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子句过滤。
答案 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
您需要的地方找不到正确的信息是一件痛苦的事。根据时间可以导致。 。 。我应该说,失望。