2009-07-31 4 views
2

Ich habe eine Reihe von Zeilen, die doppelte Einträge enthalten, da die Daten aus mehreren Quellen stammen. Ich habe auch eine separate Referenztabelle, die die Priorität dieser Datenquellen angibt.Tipps zum Deduplizieren einer Liste basierend auf der Priorität Spalte

Hat jemand gute Tipps für die effektivste t-SQL, um diese Liste zu deduplizieren? Grundsätzlich

ich habe:

SELECT a.*, b.priority 
FROM tableA as a 
JOIN tableB as b 
ON b.sourceId = a.sourceId 

Ich habe diese in eine temporäre Tabelle platzieren und dann auf eine seltsame Art und Weise zu löschen, die ich nehme an effizienter sein könnte.

Tabelle A hat die gleichen Spalten für die zwei Quellen, aber die Daten können sich unterscheiden - so können sie unterschiedliche Preise haben. Die Herausforderung besteht darin, dass ich den Preis (und alle anderen Informationen) aus der Zeile nehmen muss, die von der Quelle mit der höchsten Priorität kommt. Um die Sache zu komplizieren, habe ich keine Daten für jeden Gegenstand aus ALLEN Quellen.

So kann Element 1 Daten von Quelle A und B enthalten, während Element 2 es nur von Quelle B und C haben kann. Daher muss das Löschen auf einer Einzelartikel-Basis geschehen.

+0

1) Wenn Sie sagen, Sie doppelte Einträge müssen am Ende sind alle Spalten in TableA die gleiche für zwei Zeilen, die doppelt sind? Wenn dies nicht der Fall ist und tableA.SourceId anders ist und Sie nur eine übereinstimmende Quell-ID in tableB haben, und Sie die Duplikate löschen möchten, dann führen Sie einfach delete on tableA statt der temporären Tabelle aus. –

Antwort

1

Ich glaube, Sie so etwas tun könnte:

SELECT a.*, b.priority 
FROM tableA as a 
JOIN tableB as b 
ON b.sourceId = a.sourceId and b.priority = (select max(priority) from tableB where b.sourceId = a.sourceId) 

Ich kann mich nicht daran erinnern, ob Tsql ein in Rahmen für die Unterabfrage oder nicht, obwohl haben.

+0

Es hat an diesem Punkt Umfang - Können Sie mir erklären, wie diese geschachtelte Auswahl sich verbindet, um richtig die richtige Priorität zu bekommen? – jkelley

+1

Sicher, dass diese Abfrage für jede Zeile von TabelleA ausgeführt wird, so dass das Ergebnis für die sourceId der Zeile am höchsten ist, auf der es ausgeführt wird. Es ist so, als würde man in jeder Zeile eine Funktion ausführen. – Jon

0

Verwenden Sie ROW_NUMBER, um die zu finden, die Sie behalten möchten, und entfernen Sie dann den Rest.

... und erinnere mich an die vorherige Anweisung mit einem Semikolon ...

with t as (
SELECT a.*, row_number() over (partition by a.sourceid order by b.priority desc) as priorityorder 
FROM tableA as a 
JOIN tableB as b 
ON b.sourceId = a.sourceId 
) 
--select * from t 
delete t 
where priorityorder > 1; 

Rob