Frage

Ich habe eine Reihe von Zeilen, die doppelte Einträge enthalten, da die Daten aus mehrfachen Quellen stammen. Ich habe auch eine separate Referenztabelle, die die Priorität dieser Datenquellen an.

Hat jemand gute Tipps für die effektivste t-SQL diese Liste dedupliziert?

Im Grunde genommen habe ich:

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 wurde platzieren und dann auf eine seltsame Art und Weise zu löschen, die ich annehmen könnte effizienter sein.

DELETE ta
FROM #tmp ta
JOIN #tmp tb
ON ta.duplicateId = tb.duplicateId
WHERE ta.priority < tb.priority

Tabelle A hat die gleichen Spalten für die beiden Quellen, aber die Daten können abweichen - so dass sie unterschiedliche Preise haben können. Die Herausforderung besteht darin, dass ich den Preis nehmen muss (und alle anderen Informationen) aus der Zeile, die mit der höchsten Priorität aus der Quelle kommt. Erschwerend kommt hinzu, habe ich nicht die Daten für jedes Element von ALLEN Quellen.

So, Punkt 1 kann Daten von der Quelle A und B, während Punkt 2 nur mich von der Quelle B hat und C. Somit muss die Löschung auf einer Pro-Unikat Basis geschehen.

War es hilfreich?

Lösung

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 erinnern, wenn Tsql ein in Rahmen für die Unterabfrage haben wird oder nicht though.

Andere Tipps

Versuchen ROW_NUMBER die, die Sie behalten möchten, zu finden, und dann der Rest loszuwerden.

... und erinnere dich an die vorherige Anweisung mit einem Semikolon enden ...

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top