SQL bestimmte Datensätze löschen

m.maier

Benutzer
Beiträge
7
Hallo zusammen,
ich habe folgendes Problem.
In meiner SQL Datenbank gibt es zwei Tabellen. Buchungen von Kunden (orders) sowie die Kundendaten (customers) selbst.
Verbunden sind diese beiden Tabellen über eine ID
Nun würde ich gerne alle alten Kundendaten aus der Tabelle "customers" löschen deren ID nicht in der Tabelle "orders" vorkommt.
Könnte mir hier bitte jemand mit der SQL Abfrage helfen? Vielen Dank

Max
 
Werbung:
So in der Art, denke ich:

Code:
delete from customers
where not exists (select *
                  from orders 
                  where orders.customer_id = customers.id);

Spaltennamen musst Du natürlich anpassen.
 
Meine Idee wäre folgende:

Mit einem Beispiel:
Code:
test=# create table customer(id int primary key);
CREATE TABLE
test=# create table orders(id int primary key, customer int references customer(id) on delete cascade);
CREATE TABLE
test=# insert into customer(id) values (1), (2);
INSERT 0 2
test=# insert into orders(id, customer) values (1, 2);
INSERT 0 1
test=# delete from customer where id not in (select customer from orders);
DELETE 1
test=# select * from customer;
 id
----
  2
(1 row)

der customer mit id 1 ist nichtmehr vorhanden, weil er auch nicht in der tabelle orders vor dem delete vorgekommen ist...
 
NOT EXISTS ist typischerweise schneller als NOT IN (sofern überhaupt ein Unterschied besteht). Und hat den Vorteil, dass ein NULL Wert nicht zu Überraschungen führt (Beispiel)
 
Keine Ahnung was ein Fehler 500 ist - gibt's da keinen vernünftigen Fehlertext?
Das ist aber völlig valides SQL, vielleicht hast Du es falsch abgetippt?
 
Er meint nur Server Error, bin mir aber nicht sicher, ob es vielleicht auch an der Laufzeit liegt.
Hab es nach meinem wissen richtig abgetippt und die Namen entsprechend angepasst.
 
So würde das bei mir aussehen:
Siehst du da einen Fehler?

SQL:
delete from ej6mq_booking_customers
where not exists (select *
                  from ej6mq_booking_customers_orders
                  where ej6mq_booking_customers_orders.idcustomer = ej6mq_booking_customers.id);
 
Ja ich versuche die Abfrage in der PHPmyAdmin auf einem Webserver erst zu simulieren.
Dabei erhalte ich diesen Fehler. Die Abfrage läuft auch ca. 2 Minuten bis der Fehler angezeigt wird.
Das Error Log vom Server muss ich schauen, wo das ist.
Kann es evtl. auch daran liegen, dass es zu viele Datensätze sind bzw. kann man die Abfrage so einkürzen, dass Sie nach z.B. 100 aufhört.
Nicht das es hier ein einfacher Timeout ist?
 
Werbung:
Zurück
Oben