更新空行而不包含该行的任何唯一行

时间:2017-05-22 09:53:56

标签: c# sql sql-server

我有以下数据:

[Receipt]   [Date]     [Barcode]    [Quantity]  [Supplier]  [DeliveryID]
  0001    01/01/2000    0000001         5        Grocery        NULL
  0001    01/01/2000    0000002         7        Grocery        NULL
  0001    01/01/2000    0000571         2        Grocery        NULL
  0002    01/01/2000    0000041         5         Grocey        NULL
  0002    01/01/2000    0000701        10         Grocey        NULL
  0003    01/01/2000    0000001         9        Groceri        NULL
  

如何将增量值添加到DeliveryID

正如您所看到的,没有什么可用于区分行与另一行的唯一性。很可能会再次输入类似这些行的类似数据。

不幸的是,我无法删除该表并为新列创建一个新表。

我首先尝试计算所有null行,

SELECT COUNT(*) as TotalCount FROM dbo.Delivery WHERE DeliveryID IS NULL

创建一个for循环进行更新。

但我意识到在第一个循环之后,所有null都将被1替换,而不是每个循环更新每一行。

我曾考虑将ReceiptSupplier组合成一个唯一值,但正如我之前所说,可能会输入类似的数据,从而造成重复的行,丢失行的唯一性

3 个答案:

答案 0 :(得分:2)

使用row_number

with D as
(
    select Receipt, Date, Barcode, DeliveryID, row_number() over(order by receipt , Date, Barcode) as rn
    from delivery
    )

update D
set DeliveryID = rn
where DeliveryID is null

您甚至可以按收据进行分区,以在收据组中提供每行:

with D as
(
    select Receipt, Date, Barcode, DeliveryID, row_number() over(partition by receipt order by Date, Barcode) as rn
    from delivery
    )

update D
set DeliveryID = rn
where DeliveryID is null

答案 1 :(得分:1)

您可以使用以下列:

[Receipt]   [Date]     [Barcode]    [Quantity]

作为PrimaryKey,以便您可以识别所需的行。

或者对于[交付ID]列,您可以使用IDENTITY函数:

答案 2 :(得分:0)

添加标识可以帮助您的列

 alter table tableName add  DeliveryID int Identity(1,1)