Sql-Server
將值插入表中,將重複項放入另一個表中
所以我昨天發布了這個問題。我得到的一些回复很有幫助,但似乎我的問題比我最初想像的要復雜一些。
在做了一些查找之後,我的
INSERT
陳述出現錯誤的原因是因為我有這樣的列:part_number | description | information ------------------------------------------------ 331335A11 Desc1 Info1 331335A11 Desc2 Info1
本質上,有許多條目具有相同的
part_number
欄位值(假設是一UNIQUE
列),但其他列的值不同。因此,查詢試圖將它們插入數據庫,我有我的問題。所以我想要做的,因為我不確定我的表中有多少記錄有這個問題,就是在我的表中做
INSERT
,parts
但是每次我得到一個重複的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 |