2015-11-25 44 views
0

我有以下表結構。用於從tableB更新TABLEA的TSQL,其中沒有id的存在

Table A 
InvoiceNumber 
InvoiceDate 
Sku 
SerialNumber 

Table B 
InvoiceNumber 
Invoicedate 
Sku 
SerialNumber 

表B有有效的SerialNumbers,而表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 

我結束了在表中發現了重複的連續。

樣本數據

表一

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 

無論我做什麼,我總是在表受騙者結束了:|

+0

使用您提供的樣本數據進行更新後,表A應該如何? –

回答

0

試試這個:

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 

Demo

如果我理解正確的,也有與所有列B表的記錄,除了serialNumber有相同的價值觀,以及當前更新邏輯恰好填滿表格中的一個serialNumber的值而不是1到1的更新。上述解決方案使用row_number爲表B中的每一行創建一個額外的標識符,然後將其用作附加標準以匹配要更新的行。

+0

您是正確的先生。讓我試試這個。我實際上正在傾向於row_number類型的解決方案。 –

相關問題