2012-03-28 9 views
0

This question tut ziemlich viel, was ich erreichen möchte, aber meine Tabelle ist komplizierter und hat keinen Primärschlüssel. Ich verstehe auch nicht die Top-Antwort, was die t1 und t2 bedeuten. Wenn diese Antwort auf mich zutrifft, würde ich mich freuen wenn jemand den Code erklärt.Halten Sie zuerst von doppelten Datensätzen und löschen Sie den Rest

Ich habe mehrere Monate Tabellen, die Informationen über Kunden und die Richtlinien enthalten, die sie halten. Jeder Client verfügt über eine eindeutige Richtlinien-ID, kann jedoch mehrere Richtlinien haben, die zu mehreren Datensätzen unter derselben Richtlinien-ID führen. Die doppelten Datensätze können in jedem Feld völlig unterschiedlich oder exakt gleich sein.

Für meine Zwecke, Ich möchte nur einen Datensatz für jede Policy-ID zu behalten. Idealerweise ist die Aufzeichnung die mit dem höchsten Alter, muss aber nicht, wenn es zu kompliziert ist. Beachten Sie, dass es mehr als einen Datensatz mit dem Alter geben kann, das für diese bestimmte Richtlinien-ID maximal ist. Dann ist es egal, welche davon wir behalten.

Ich plane nicht, einen Primärschlüssel zu erstellen, da es einige Fälle gibt, in denen ich zwei Datensätze unter derselben Richtlinien-ID aufbewahre, die ich selbst am Code ändern werde. Ich möchte auch keine andere Tabelle erstellen, weil ich mit 10+ Tabellen arbeite. Jemand schlug vor, first() zu verwenden, aber ich bin nicht sicher, wie man es in eine Abfrage einbaut.

Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen, und danke für Ihre Hilfe im Voraus!

========= UPDATE # 1

Okay, sieht aus wie meine Frage ein wenig unrealistisch war, so dass ich eine Autowert Primärschlüssel hinzuzufügen. Wie werde ich damit fortfahren?

+2

sollten Sie wirklich einen Primärschlüssel sollten Sie erwägen, wie es macht es einen einzelnen Datensatz so viel einfacher zu identifizieren und würde Ihnen helfen, dups löschen. Hinweis: Wenn Sie einen Primärschlüssel haben, bedeutet das nicht, dass Sie immer noch keine Duplikate haben können. –

+0

Ich denke, du wirst etwas nachgeben müssen. Entweder müssen Sie eine neue Tabelle erstellen oder Sie müssen einen eindeutigen Schlüssel hinzufügen. – Fionnuala

Antwort

3

Etwas auf diesen Linien:

DELETE Policies.* 
FROM Policies 
WHERE Policies.ID Not In (
    SELECT TOP 1 id 
    FROM policies p 
    WHERE p.policyid = policies.policyid 
    ORDER BY createdate DESC, id) 
+1

Ich habe versucht, die SELECT-Anweisung der inneren Klammer selbst auszuführen, und bat mich, den Parameterwert von Policies.PolicyID einzugeben. Kann ich nur bestätigen, dass ich Ihren Code richtig verstanden habe? ID = Autonummer Primärschlüssel; Richtlinien = die Tabelle; P = Richtlinientabelle. Wäre nicht die vorletzte Zeile dann immer wahr? Außerdem gibt die innere Klammer nur einen Datensatz aus. – Emily

+1

Die Idee verwendet zwei IDs, die Policy ID in Ihrem Text erwähnt, die dupliziert werden können, und ID, die die neue Autonummer ist. Die innere Klammer gibt einen Datensatz pro Richtlinien-ID aus, mit dem Sie enden möchten. Ich habe mit einer Probentabelle getestet. – Fionnuala

+1

Ohhhh ok Entschuldigung, ich habe den Code verstanden. Ich habe einen Testlauf an einem meiner Tische mit 30k-Platten gemacht. Es scheint zu funktionieren! Also vielen Dank! Eine letzte Sache, die Abfrage dauerte eine ganze Weile - ist das normal? Ich mache mir nur Sorgen, weil eine meiner Tabellen 900k Datensätze hat. – Emily