Sql-Server

將值插入表中,將重複項放入另一個表中

  • August 17, 2018

所以我昨天發布了這個問題。我得到的一些回复很有幫助,但似乎我的問題比我最初想像的要復雜一些。

在做了一些查找之後,我的INSERT陳述出現錯誤的原因是因為我有這樣的列:

part_number  |  description  | information 
------------------------------------------------
331335A11       Desc1          Info1
331335A11       Desc2          Info1

本質上,有許多條目具有相同的part_number欄位值(假設是一UNIQUE列),但其他列的值不同。因此,查詢試圖將它們插入數據庫,我有我的問題。

所以我想要做的,因為我不確定我的表中有多少記錄有這個問題,就是在我的表中做INSERTparts但是每次我得到一個重複的part_number值,而不是將它插入到parts表中,它是而是插入到一個名為的表中,該表parts_duplicates沒有part_number列的唯一限制(但仍然具有與表相同的列parts。從這裡我可以分析我不正確的數據點並修復它們(希望如此)。

我唯一的問題是……我什至不知道從哪裡開始解決這個問題。在我在上面發布的問題中,建議使用其中一個回复MERGE,我目前正在對其進行測試,但我想知道是否有更好的方法來解決這個問題。

這是一個似乎可行且不需要觸發器的可能解決方案 - 您必鬚根據您的真實數據對其進行測試。

--Demo setup
Declare @Parts table (part_number varchar(30), description varchar(30), information varchar(30))
Declare @PartsTemp table (part_number varchar(30), description varchar(30), information varchar(30))
Declare @PartsDuplicates table (part_number varchar(30), description varchar(30), information varchar(30))

insert into @Parts(part_number,description,information) values
('331335A10', 'Desc1', 'Info1')     --Row already exists on the @Parts table

insert into @PartsTemp(part_number,description,information) values
('331335A00', 'Desc1', 'Info1'),    --No row on the @Parts table and no duplicate
('331335A10', 'Desc1', 'Info1'),    --Row already exists on the @Parts table
('331335A11', 'Desc1', 'Info1'),    --No row on the @Parts table
('331335A11', 'Desc2', 'Info1')     --Duplicate row on the @PartsTemp table


--The solution

--Common table expression to add row number to each PartsTemp row
;WITH PartsTempAndRowNumber
AS (
   SELECT *
       ,ROW_NUMBER() OVER (
           PARTITION BY part_number ORDER BY description
           ) AS rn
   FROM @PartsTemp
   )

--Insert into @PartsDuplicates where either:
--The rn<>1 - meaning duplicates on the @PartsTemp table
--OR
--The part number already exists on the @Parts table
INSERT INTO @PartsDuplicates (
   part_number
   ,description
   ,information
   )
SELECT part_number
   ,description
   ,information
FROM PartsTempAndRowNumber ptarn
WHERE rn <> 1

UNION ALL

SELECT ptarn.part_number
   ,ptarn.description
   ,ptarn.information
FROM PartsTempAndRowNumber ptarn
JOIN @Parts pt
   ON pt.part_number = ptarn.part_number
       AND ptarn.rn = 1

--Insert rows to @Parts selecting from @PartsTemp where the part_number can't be found
--on the @PartsDuplicates table
INSERT INTO @Parts (
   part_number
   ,description
   ,information
   )
SELECT part_number
   ,description
   ,information
FROM @PartsTemp pt
WHERE NOT EXISTS (
       SELECT *
       FROM @PartsDuplicates
       WHERE part_number = pt.part_number
       )

--Verify @Parts rows
SELECT *
FROM @Parts
ORDER BY part_number

--Verify @PartsDuplicates rows
SELECT *
FROM @PartsDuplicates
ORDER BY part_number

執行後@Parts

| part_number | description | information |
|-------------|-------------|-------------|
| 331335A00   | Desc1       | Info1       |
| 331335A10   | Desc1       | Info1       |

執行後@PartsDuplicates

| part_number | description | information |
|-------------|-------------|-------------|
| 331335A10   | Desc1       | Info1       |
| 331335A11   | Desc2       | Info1       |

引用自:https://dba.stackexchange.com/questions/215208