2012-04-02 11 views
0

enter code hereenter image description hereLöschen

Mein Problem ist folgendes: in dieser Datenbank die Verknüpfungstabelle enthält einige Zeilen, in denen die kha_id und die icd_fk sind die gleichen. Während es in Ordnung ist, dass kha_id mehr als einmal in icd_junction erscheint, muss es mit einem separaten icd_fk sein. Ich kann eine Abfrage ausführen und alle ID # s und die Codes erhalten, die mehr als einmal aufgelistet sind, aber gibt es eine Industriestandard-Methode zum Löschen aller bis auf ein Vorkommen von jedem?

Beispiel: Was ich habe, ist über

KHA_ID: 123456 V23 
     123456 V23 
     123456 V24 

I need one of the rows kha_id=123456 and ICD_FK=V23 taken out. 
+0

Prüfbedingung? http://msdn.microsoft.com/en-us/library/ms188258.aspx – MilkyWayJoe

+1

Industriestandard wäre, keine falsche ID-Spalte in "ICD_Junction" zu haben, wenn "KHA_ID" und "ICD_FK" zusammen eine perfekte bilden würden Primärschlüssel dafür. – AakashM

Antwort

3

dieses:

DELETE j1 
    FROM ICD_Junction AS j1 
WHERE EXISTS 
     (SELECT 1 
      FROM ICD_Junction AS j2 
      WHERE j2.KHA_ID = j1.KHA_ID 
      AND j2.ICD_FK = j1.ICD_FK 
      AND j2.ID < j1.ID 
     ) 
; 

löscht, jeder für KHA_ID und ICD_FK, alle bis auf eine entsprechende Zeile von ICD_Junction. (Genauer gesagt, behält es die mit der niedrigsten ID, und den Rest löschen.)

Sobald Sie die oben genannten ausgeführt haben, sollten Sie beheben, was Code die Duplizierung verursacht, und fügen Sie eine unique constraint, um dies erneut zu verhindern .

(Haftungsausschluss: Nicht getestet, und es ist schon eine Weile her, seit ich das letzte Mal SQL Server verwendet.)


Edited hinzufügen: Wenn ich Ihren Kommentar richtig zu verstehen, müssen Sie auch Hilfe bei der Suche nach Duplikaten? Dafür können Sie schreiben:

SELECT KHA_ID, 
     ICD_FK, 
     COUNT(1)   -- the number of duplicates 
    FROM ICD_Junction 
GROUP 
    BY KHA_ID, 
     ICD_FK 
HAVING COUNT(1) > 1 
; 
+0

Die Duplizierung wurde für Abrechnungszwecke verursacht und ist nicht inkorrekt. Zu Forschungszwecken muss ich nur wissen, ob es da war oder nicht :) Danke :) – wootscootinboogie

+0

Um es am wenigsten zu behalten, denke ich, dass es j2.ID sein sollte> immer noch +1 – Paparazzi

+0

@wootscootinboogie Ihr Kommentar stimmt nicht mit dem überein problem statement "es muss mit einem separaten icd_fk sein" – Paparazzi

2

Die ursprüngliche Frage war löschen, aber der Kommentar war

 Select jDup.* 
     FROM ICD_Junction AS j 
     JOIN ICD_Junction AS jDup 
     On j.KHA_ID = jDup.KHA_ID 
     AND j.ICD_FK = jDup.ICD_FK 
     AND j.ID < jDup.ID 

     Select max(jDup.ID), min(jDup.ID), count(*), jDup.KHA_ID, jDup.ICD_FK 
     FROM ICD_Junction AS jDup 
     Group By jDup.KHA_ID, jDup.ICD_FK 
     Having Count(*) > 1 
+0

Beachten Sie, dass das * * * zu viele Ergebnisse geben kann; Wenn zum Beispiel eine bestimmte '(KHA_ID, ICD_FK)' - Kombination zehn Mal erscheint, gibt Ihre Abfrage fünfundvierzig (9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1) Zeilen für diese Kombination aus. – ruakh

+0

OK, aber ich dachte mehr einzelne Duples. Ich werde aktualisieren. – Paparazzi

0

Sie wollen etwas finden, das von ROW_NUMBER() und Partition verwendet. Der Grund dafür ist, dass Sie eine Zeile auswählen können, die Sie von einer Tabelle behalten möchten, die keine eindeutige ID hat. Wenn es sich um eine reine Schnittpunkttabelle ohne Identität handelt, können Sie eine Variation verwenden, um alle Zeilen zu löschen, bei denen RowID> 1 ist. Sie erhalten nur die eindeutigen Zeilen. Und es funktioniert genauso gut, wenn Sie eine eindeutige ID haben, bei der Sie die älteste ID beibehalten können.

select * from (select KHA_ID, ICD_FK, ROW_NUMBER() 
      OVER(PARTITION BY KHA_ID, ICD_FK 
      ORDER BY ID ASC) AS RowID 
    from ICD_Junction) ordered where RowID > 1