PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : sql: duplikate entfernen?


ooAlbert
2008-02-25, 16:57:19
Hi,

ich versuch jetzt seit einer weile irgendwie ein SQL statement zu erstellen das mir duplikate in einer Tabelle entfernt ... klappt aber nicht.

wie macht man sowas am besten? In der tabelle sind die kompletten zeilen identisch, also nicht nur ein teil und es gibt immer mindestens ein duplikat.

als dbs nutz ich Access-2003 aber sql sollte ja überall funktionieren ;)

gr@fz@hL
2008-02-25, 17:16:39
Wenn die Zeilen komplett doppelt sind, d.h. keine id haben, in der sie sich unterscheiden, bekommst du sie nicht raus. Du kannst dir aber mit select distinct * jede Zeile nur einmal anzeigen lassen.

und btw. SQL ist leider nicht überall gleich ;)

ooAlbert
2008-02-25, 17:25:01
naja ich hab ne distinct abfrage gemacht und die duplikate so sichtbar aber wie bekomm ich das teil jetzt in eine löschabfrage? :)

Berni
2008-02-25, 17:38:09
Wenn du ne Spalte mit Autowert hinzufügst, dann müsstest du pro Datensatz eine ID haben über die du löschen kannst.

ooAlbert
2008-02-25, 17:42:59
kann man denn kein distinct irgendwo in die delete anweisung schmuggeln? :) dann wäre das problem ja eigentlich gelöst.

oder die tabelle auf sich selbst joinen, nur das einmal die werte distinct sind und einmal nicht, das man nur die schnittmenge sieht und löscht?

Ganon
2008-02-25, 18:09:46
Wie wäre es wenn du die Tabelle mit DISTINCT abfragst und die Ergebnismenge speicherst (INSERT INTO... SELECT FORM...), die alte Tabelle löschst und die Neue nimmst?

PatkIllA
2008-02-25, 18:28:13
mir würde noch einfallen, dass du einmal alle Werte mit Distinct abfragst.
Dann in einer Schleifen jede Zeile des Ergebnisses die Anzahl der Treffer abfragst und dann das Löschen mit LIMIT so einschränkst, dass ein Eintrag überbleibt.
Mit einem einzigen DELETE Befehl wüsste ich jedenfalls nichts.

gr@fz@hL
2008-02-25, 20:53:41
Wenn du ne Spalte mit Autowert hinzufügst, dann müsstest du pro Datensatz eine ID haben über die du löschen kannst.
Wenn zwie Zeilen absolut identisch sind, kannst du keinen Autowert mehr hinzufügen, weil das DBMS durcheinander kommt. Aber ich find die Idee von Ganon super...

Berni
2008-02-25, 20:58:58
Wenn zwie Zeilen absolut identisch sind, kannst du keinen Autowert mehr hinzufügen, weil das DBMS durcheinander kommt. Aber ich find die Idee von Ganon super...
Echt? Hab das mal grad in Access getestet mit ein paar Werten und da ging das im Nachhinein einwandfrei. Einfach in der Entwurfsansicht nen Primärschlüssel mit Felddatentyp Autowert hinzufügen. Kann aber sein, dass es zu wenig Werte gesamt waren.
Trotzdem finde ich auch die Methode von Ganon eine sehr gute Idee. Dürfte wohl fast einfacher sein!

ooAlbert
2008-02-26, 11:51:11
also ich hab mir gestern den kopfzerbrochen und auch ewig verschiedenen durchgespielt. mit joins fruchtet das wohl nicht vor allem da access eh nicht alle joinarten beherscht. Wenn ichs richtig verstanden habe wäre der natural-join das was man bräuchte, da wird jeder treffer nur einmal mit dem gegenstück verbunden, dh. es wäre dann faktisch wien distinct :)

ooAlbert
2008-03-10, 14:49:26
ich nochmal ...
ich hab jetzt eine zusätzliche spalte eingefügt, so das bei jedem import automatisch ein autoincrement generiert wird und somit die zeilen eineindeutig sind.

meine löschfunktion sieht so aus:

DELETE DISTINCTROW T1.*, T1.id
FROM bank_csv AS T1 INNER JOIN bank_csv AS T2 ON (T1.ts = T2.ts) AND (T1.p_name = T2.p_name)
WHERE (T1.id>T2.id);

Jetzt hab ich fast das korrekte ergebnis. in der spalte TS kann es zusätzlich dopplungen geben, dh. nur der wert TS wäre dopplet vorhanden der rest der zeile nicht. aus irgendeinem grund entfernt die routine diese zeile zusätzlich, so das das ergebnis inkorrekt ist um diese eine zeile...

wie muß das denn aussehen um das noch zu umgehen?