Sql server 用于从不存在id的tableB更新TABLEA的TSQL

Sql server 用于从不存在id的tableB更新TABLEA的TSQL,sql-server,tsql,duplicates,Sql Server,Tsql,Duplicates,我有下面的表结构 Table A InvoiceNumber InvoiceDate Sku SerialNumber Table B InvoiceNumber Invoicedate Sku SerialNumber 表B具有有效的序列号,而表A不具有其空白。我想用表B的序列号更新表A 可以有多条记录具有相同的invoiceNumber、Invoicedate和Sku,只有serialNumber是唯一的 如果我做一个 update tablea set serialNumber = t

我有下面的表结构

Table A
InvoiceNumber
InvoiceDate
Sku
SerialNumber

Table B
InvoiceNumber
Invoicedate
Sku
SerialNumber
表B具有有效的序列号,而表A不具有其空白。我想用表B的序列号更新表A

可以有多条记录具有相同的invoiceNumber、Invoicedate和Sku,只有serialNumber是唯一的

如果我做一个

update tablea set serialNumber = tableb.serialNumber
where tablea.sku = tableb.sku
and tablea.invoicenumber = tableb.invoicenumber
and tablea.invoicedate = tableb.invoicedate
我最终得到了表a中的重复序列

样本数据

表a

InvoiceNbr : 1 invoiceDate = 10/01/2015 sku = ABC serial = blank
InvoiceNbr : 1 invoiceDate = 10/01/2015 sku = ABC serial = blank
表b

InvoiceNbr : 1 invoiceDate = 10/01/2015 sku = ABC serial = abc
InvoiceNbr : 1 invoiceDate = 10/01/2015 sku = ABC serial = xyz
无论我做什么,我总是在表a中以重复结束:|

试试这个:

update tableA
set serialNumber = b.serialNumber
from (select *, row_number() over (partition by invoicenumber, invoicedate, sku order by serialnumber) rn from tableA) a
inner join
(select *, row_number() over (partition by invoicenumber, invoicedate, sku order by serialnumber) rn from tableB) b 
on a.sku = b.sku and a.invoicenumber = b.invoicenumber and a.invoicedate = b.invoicedate and a.rn = b.rn

如果我理解正确,表B中有除serialNumber之外的所有列都具有相同值的记录,并且您当前的更新逻辑只是用serialNumber的一个值而不是1对1更新填充表A。上述解决方案使用row_number为表B中的每一行创建一个额外的标识符,然后将其作为一个额外的标准来匹配要更新的行。

使用您提供的示例数据更新后,表A应该是什么样子?您是对的,先生。让我试试这个。我实际上是被一个行数类型的解决方案所吸引。