2016-09-13 3 views
1

Ich habe festgestellt, dass unsere Website zu ERP Integration Tool Inserts duplizieren wird, wenn ein Fehler während der Synchronisierung auftritt. Bis der Fehler behoben ist, werden die Datensätze jedes Mal neu synchronisiert, wenn die Synchronisierung wiederholt wird (normalerweise alle 5 Minuten).Aktualisieren von doppelten Datensätzen, so dass sie gefiltert werden

Versuchen, eine effektive Möglichkeit zu finden, doppelte Datensätze zu aktualisieren, so dass bei einer Abfrage, dass die Duplikate gefiltert werden. Die Herausforderung, die ich habe, ist, dass ein Duplikat einige Spalten haben wird, die unterschiedlich sind.

Zum Beispiel, mit Blick auf die Tabelle SalaesOrderDetail, hatte eine Bestellung 120 Positionen. Aufgrund eines Synchronisierungsproblems wurde jedoch jede Zeile dupliziert.

Ich habe versucht, die folgenden Test für den letzten Monat mit:

WITH cte AS (
SELECT SOHD.[salesorderno], [itemcode],[CommentText], unitofmeasure, itemcodedesc, quantityorderedoriginal, quantityshipped, 
row_number() OVER(PARTITION BY SOHD.[salesorderno], [itemcode], unitofmeasure, itemcodedesc, quantityorderedoriginal, quantityshipped ORDER BY SOHD.[Linekey] desc) AS [rn] 
FROM [dbo].[SO_SalesOrderHistoryDetail] SOHD 
inner join [dbo].[SO_SalesOrderHistoryHeader] SOHH on SOHH.Salesorderno = SOHD.Salesorderno 
Where year(orderdate) = '2016' 
and month(orderdate) = '08' 
--Only Look at completed orders, ignore quotes & deleted orders 
and SOHH.Orderstatus in ('C') 
--Only looks for item lines where something did not ship (prevent removing a "good" entry) 
and [quantityshipped] = '0' 
) 
Select * 
from cte 

Allerdings halte ich Probleme bei der Verwendung dieses, weil, wenn ich einen Update-Befehl mit diesem laufen, wird es einige finden aktualisieren Aufzeichnungen sollten es nicht. Und wenn ich einige der Spalten dazu hinzufüge, um genauer zu sein, würde es einige Spalten nicht bearbeiten, die es benötigt.

Zum Beispiel, wenn ich nicht hinzufügen

where rn >1 then I inadvertently edit records that are not duplicates 

aber wenn ich

where rn >1 then the 1st set of duplicate records won't be updated. 

Gefühl stecken hinzufügen, aber nicht sicher, was zu tun ist.

Weitere Informationen aus dem Kommentarbereich hinzufügen. Ich denke, vielleicht muss meine Cte-Anweisung, um die Duplikate und einen Update-Befehl zu finden, etwas anders sein. Beispieldaten:

Order# Itemcode CommentText UnitofMeasure itemcodedesc qtyordered qtyshipped 
12345  abc  null   each   candy   5   0 
12345  abc  null   each   candy   5   5 
12345  xyz  null   case   slinky   25   0 
12345  xyz  null   case   slinky   25   25 

So sind sie Duplikate nicht, wenn ich die qtyshipped Spalte enthalten, aber was ich will tun Update nur die Datensätze, in denen die qtyshipped = 0. Das Update habe ich vor so eingestellt ist Comment = ' löschen‘

Antwort

1

ändern ROW_NUMBER-COUNT() Over() Fensterfunktion

WITH cte 
    AS (SELECT SOHD.[salesorderno], 
       [itemcode], 
       [commenttext], 
       unitofmeasure, 
       itemcodedesc, 
       quantityorderedoriginal, 
       quantityshipped, 
       Count(1) 
        OVER(partition BY SOHD.[salesorderno], [itemcode], unitofmeasure,itemcodedesc) AS [rn] 
     FROM [dbo].[so_salesorderhistorydetail] SOHD 
     ..........) 
SELECT * 
FROM cte 
WHERE rn > 1 
+0

So, nachdem das zu tun, auf meine Bestellung, wo ich 240 Zeilen haben (120 Duplikate) bekomme ich nur 2 Treffer. – MattC

+0

@MattC - Dann ist deine 'Partition von' falsch. Was ist die Kombination für die Suche nach Duplikat –

+0

Ich denke, das ist, wo ich feststecke. Ich denke, ich muss auf meine ursprüngliche Nachricht antworten, um die Ausgabe in einer sinnvollen Ausgabe zu zeigen. – MattC

Verwandte Themen