AW: [Python-de] Newbie-Frage: Sequenzen vergleichen

Thomas Fanslau tfanslau at gmx.de
Wed Sep 18 16:01:05 EDT 2002


Thomas Fritz schrieb:
> Hallo,
> ok, folgende query benutze ich:
> SELECT a.pnr FROM tab a LEFT JOIN tab b ON (a.id < b.id AND a.pnr=b.pnr AND
> b.datum="2002-04-02" AND b.art="02")
> WHERE a.datum="2002-04-02"
> AND a.art="03"
> AND b.paket IS NULL

Also ich habe jetzt kein SQL-System hier (zu Hause) und mit MYSQL habe 
ich nicht viel Erfahrung. Soviel vorne weg.

Aber generell würde ich einfach auf die Formulierung des LEFT JOIN in 
der FOR-Clause verzichten und die Abfragen nach hinten in die 
WHERE-Clause ziehen.
Dann hängt es sicherlich von dem Optimizer ab und den gesetzten Indexen, 
aber zuerst sollte 'a' möglichst eingedampft werden bevor 'b' 
hinzugebunden wird. Also ungefähr so

SELECT
	a.pnr
FROM
	tab a,
	tab b	
WHERE
	a.datum = "2002-04-02"
AND 
a.art = "03"
AND 
a.pnr = b.pnr
AND 
a.datum = b.datum
AND 
b.paket IS NULL
AND 
b.art = "02"
AND 
a.id < b.id

Die kleiner-Abfrage muss auf jeden Fall nach hinten, denn der Resultset 
dafür ist riesig. Diesen im Join nach vorne zu setzen ist tödlich.
Und ich gehe davon aus, das das Datum bei 'a' und 'b' nicht zufällig 
dasselbe war.
Es könnte Sinn machen die Verknüpfung nach vorne zu ziehen, aber das 
hängt vom Optimizer ab ob er die erst später auflöst oder erst eine 
temporäre Tabelle mit dem Kreuzprodukt erstellt.

Ich empfehle "Joe Celko's SQL for Smarties : Advanced SQL Programming", 
besonders den Abschnitt über "Old versus New Join Syntax"...

--tf
www.tfanslau.de








More information about the Python-de mailing list