SQL Befehl der doppelte Einträge löscht

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
frindly
Beiträge: 1085
Registriert: 23.10.2007 08:13:26
Wohnort: Recklinghausen

SQL Befehl der doppelte Einträge löscht

Beitrag von frindly » 23.12.2011 11:05:45

Ich habe eine Tabelle mit folgendem Aufbau:

id kdnr artnr preis
1 1234 abc 10
2 4556 bbc 11
3 3244 abc 11
4 1234 abc 11

das sind hinterlegte Preise für einen Onlineshop. Jetzt sind
für Kunde 1234 zwei Preise für den Artikel abc hinterlegt.
Der Preis 10 Euro wurde als erstes hinterlegt, nachträglich aber dann auf 11 Euro gesetzt.
Der Shop fängt jetzt mit der Suche an und nimmt den ersten Treffer, also den alten 10 Euro Preis.
Jetzt brauche ich ein SLQ Script, das folgendes macht:
Wenn Kundennummer und Artikelnummer gleich ist soll die älteste ID gelöscht werden.
In diesem Fall also id 1.

Hat jemand eine Idee??? :roll: :roll: :roll:

Benutzeravatar
shoening
Beiträge: 914
Registriert: 28.01.2005 21:05:59
Lizenz eigener Beiträge: MIT Lizenz

Re: SQL Befehl der doppelte Einträge löscht

Beitrag von shoening » 23.12.2011 14:18:06

Hi,

das geht eigentlich ganz einfach:

Code: Alles auswählen

DELETE FROM preistabelle WHERE id IN (SELECT min(id) FROM preistabelle GROUP BY kdnr, artnr HAVING COUNT(id) > 1)
Dabei gehe ich davon aus, dass die IDs fuer die spaeteren Preise immer hoeher sind!

Ciao
Stefan
Bürokratie kann man nur durch ihre Anwendung bekämpfen.

Benutzeravatar
frindly
Beiträge: 1085
Registriert: 23.10.2007 08:13:26
Wohnort: Recklinghausen

Re: SQL Befehl der doppelte Einträge löscht

Beitrag von frindly » 23.12.2011 16:10:16

Ich habe diese Lösung "erarbeitet" :wink:

Code: Alles auswählen


CREATE  TABLE temp AS SELECT min( pr_id ) AS pr_id2, count( * ) AS pr_id, count( * ) AS anzahl, c_id, products_id FROM xt_plg_customers_price GROUP BY c_id, products_id HAVING count( * ) >=2;
delete from xt_plg_customers_price where pr_id in(select pr_id2 from temp);
DROP TABLE `temp`; 

Antworten