SQL-Abfrage mit JOIN

SQL-Abfrage mit JOIN

am 01.03.2006 22:15:58 von Andreas Hofmann

Hallo,

Ich steh grade etwas auf dem Schlauch. Ich habe da ein
"gewachsenes System" und müsste eine Löschung von nicht
mehr angebundenen Daten vornehmen.

Also: Situation ist folgende:
- 1:n-Beziehung zweier Tabellen
- Köpfe (1-Tabelle) wurden gelöscht
- Positionen (n-Tabelle) sind noch vorhanden

Ich möchte nun auch die Positionen löschen, also die
Datensätze bei denen der foreign key des Kopfes in
der Kopf-Tabelle nicht mehr vorhanden ist.

Ich dachte zuerst, im Thread von Sebastian Wittek von
gestern wird genau mein Problem beschrieben, aber beim
Versuch, die Abfrage für meine Tabellen umzuschreiben,
kamen viel zu wenige Datensätze heraus (80 000). Um das
klar zu machen: Es sind 140 000 Köpfe da, es darf aber
nur maximal 5 Positionen pro Kopf geben, also maximal
700 000, es sind aber 3 000 000 Positionen vorhanden,
also mindestens 2,3 Mio zuviel.

Die Abfrage ist bis jetzt (ad=Köpfe, picture=Positionen):

SELECT p.pictures_siteid
FROM ad
LEFT JOIN picture p
ON ad.id = p.pictures_siteid
WHERE p.pictures_siteid is NULL

Noch ne Frage: Gibt's bei MySQL Löschweitergaben, sprich
wenn man den Kopf löscht, werden auch die zugehörigen
Positionen gelöscht?

Gibt's irgendwo ne Website, auf der so einen Tick
kniffligere Abfragen als die absoluten Basics erklärt
werden bzw. es Beispiele gibt?

Grüße,

Andreas

Re: SQL-Abfrage mit JOIN

am 02.03.2006 01:52:11 von Andreas Hofmann

Ich schrieb:
> Die Abfrage ist bis jetzt (ad=Köpfe, picture=Positionen):
>
> SELECT p.pictures_siteid
> FROM ad
> LEFT JOIN picture p
> ON ad.id = p.pictures_siteid
> WHERE p.pictures_siteid is NULL

Das ist natürlich nur die Testabfrage, wieviele Datensätze
die DELETE-Abfrage denn nun betreffen würde.

Was ich noch erwähnen sollte: Subqueries mit NOT IN(SELECT...)
oder NOT EXISTS(SELECT...) funktionieren leider nicht, weil
die MySQL-Version noch 4.0.18 ist, da gibt es diese Konstrukte
noch nicht.

Grüße,

Andreas

Re: SQL-Abfrage mit JOIN

am 02.03.2006 11:03:35 von Thomas Rachel

Andreas Hofmann wrote:

> Also: Situation ist folgende:
> - 1:n-Beziehung zweier Tabellen
> - Köpfe (1-Tabelle) wurden gelöscht
> - Positionen (n-Tabelle) sind noch vorhanden
>
> Die Abfrage ist bis jetzt (ad=Köpfe, picture=Positionen):
>
> SELECT p.pictures_siteid
> FROM ad
> LEFT JOIN picture p
> ON ad.id = p.pictures_siteid
> WHERE p.pictures_siteid is NULL

Das ergibt keinen Sinn. Da bekommst Du nur lauter NULL-Werte heraus, damit
kannst Du vermutlich wenig anfangen...

Köpfe (1-Tabelle) wurden gelöscht -> WHERE ad.id IS NULL


Thomas