Sebastian Goertz: JOIN-Abfrage optimieren

Beitrag lesen

Hallo,

wäre es im inneren Select nicht günstiger, mit min zu arbeiten?

SELECT MIN(plz) FROM geodata WHERE plz >= user.plz

Das war auch mein erster Ansatz, hat aber keinen (nennenswerten) Unterschied gebracht. Eher noch brauchte diese Anfrage deutlich länger bis zum Ergebnis.

Abgesehen davon halte ich das Verfahren, einfach die nächsthöhere Postleitzahl zu benutzen, für fragwürdig.

Habe gelesen, das sei die gängige Praxis. Allerdings könnte ich die Abfrage auch anders gestalten. Ohnehin habe ich "Durchschnittswerte" erzeugt für alle übergeordneten PLZ-Bereiche (also bsp. 44 für 44???). Neuer Ansatz wäre demnach, die letzte Ziffer zu streichen, sollte die angegebene PLZ nicht gefunden werden. Eine Entsprechende CASE-Anweisung konnte ich auch bereits zusamenbasteln, aber wieder tritt meine Problematik auf. Ebenso versuchte ich es mit verschaltelten IF's bzw. XOR...

Kann ich nicht "einfach" die LEFT JOIN Abfrage auf ein Ergebnis begrenzen ohne dort ein verschachteltes SELECT einbauen zu müssen?

Grüße,
Sebastian

PS: Die Anweisung sähe derzeit (fehlerhaft) so bei mir aus:

SELECT user.*, geodata.x, geodata.y, geodata.z  
FROM user  
LEFT JOIN geodata ON geodata.plz =  
CASE user.plz WHEN geodata.plz THEN user.plz  
WHEN SUBSTR(user.plz,1,CHAR_LENGTH(user.plz)-1) THEN SUBSTR(user.plz,1,CHAR_LENGTH(user.plz)-1)  
WHEN SUBSTR(user.plz,1,CHAR_LENGTH(user.plz)-2) THEN SUBSTR(user.plz,1,CHAR_LENGTH(user.plz)-2)  
WHEN SUBSTR(user.plz,1,CHAR_LENGTH(user.plz)-3) THEN SUBSTR(user.plz,1,CHAR_LENGTH(user.plz)-3)  
WHEN SUBSTR(user.plz,1,CHAR_LENGTH(user.plz)-4) THEN SUBSTR(user.plz,1,CHAR_LENGTH(user.plz)-4)  
END  
LIMIT 0,2