SQL Server:在UPDATE之前检查现有条目

SQL Server : check for existing entry before UPDATE

本问题已经有最佳答案,请猛点这里访问。

我正在整理表中的错误条目。 特别是对于这个在线商店,有制造商和他们的文章编号。 有时制造商已经创建了两次,有两个不同的名称,例如"VHY"和"Vishay"应该是相同的。 所以我想把它合并成一个正确的制造商。

我有以下SQL语句:

1
2
3
4
5
6
7
8
9
/** Old Manufacturer Name **/
DECLARE @OLD VARCHAR(100) = 'VHY';
/** New Manufacturer Name **/
DECLARE @NEW VARCHAR(100) = 'VISHAY';

/** Updating the table **/
UPDATE [ESO65].[dbo].[ESO$Manufacturer Item]
SET [Manufacturer Code] = @NEW
WHERE [Manufacturer Code] = @OLD

不幸的是我收到错误消息:

Violation of PRIMARY KEY constraint 'ESO$Manufacturer Item$0'. Cannot insert duplicate key in object 'dbo.ESO$Manufacturer Item'.

这是因为有重复的条目,其中Manufacturer Code = VHY, Manufacturers Item No_= TESTManufacturer Code = Vishay, Manufacturers Item No_= TEST。 所以这是重复的对象违规。

如何删除旧条目的所有条目,如果有双条目,然后将旧条目重命名为新条目?

enter image description here


此脚本仅删除现有条目。 为更新腾出空间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/** Old Manufacturer Name **/
DECLARE @OLD VARCHAR(100) = 'VHY';
/** New Manufacturer Name **/
DECLARE @NEW VARCHAR(100) = 'VISHAY';    

BEGIN TRANSACTION t
  DELETE t1
  FROM [ESO$Manufacturer Item] t1
  JOIN [ESO$Manufacturer Item] t2
  ON t1.[Manufacturer Code] = @OLD AND
  t2.[Manufacturer Code] = @NEW
  AND t1.[Manufacturers Item No_] = t2.[Manufacturers Item No_]

  UPDATE [ESO$Manufacturer Item]
  SET [Manufacturer Code] = @NEW
  WHERE [Manufacturer Code] = @OLD
COMMIT TRAN T;


首先,您必须删除重复记录。
以下脚本将删除重复项。 (根据给定的信息)

1
2
3
4
5
6
7
8
9
10
11
DELETE FROM [ESO65].[dbo].[ESO$Manufacturer Item] AS DeleteItem
WHERE DeleteItem.[Manufacturer Code] = @OLD
AND DeleteItem.[Manufacturer Item] IN
(
  -- SELECT DUPLICATES
  SELECT DuplicateItem.[Manufacturer Item]
  FROM [ESO65].[dbo].[ESO$Manufacturer Item] AS DuplicateItem
  WHERE (DuplicateItem.[Manufacturer Code] = @OLD OR DuplicateItem.[Manufacturer Code] = @NEW)
  GROUP BY DuplicateItem.[Manufacturer Item]
  HAVING COUNT(*)>1
)

然后,您可以运行更新脚本。