![]() |
Datenbank: Firebird • Version: 2.0 • Zugriff über: Firebird Net Provider
SELECT JOIN MIN richtig kombinieren?
Hallo,
mit meinen vielen vergeblichen Versuchen komme ich immer stärker durcheinander und bitte deshalb um Hilfe.
Ziel soll etwas wie folgt werden:
SQL-Code:
Es gelingt mir aber nicht, die JOIN-Klausel so zu erweitern oder ein SubSelect so einzubauen, dass MIN(PLZ) (oder FIRST 1) berücksichtigt wird.
SELECT ORTE2.Name, ORTE2.Alort,
PLZ.PLZ, PLZ.Plz_Art, PLZ.Str-Verz FROM ORTE2 JOIN PLZ ON PLZ.Alort = ORTE2.Alort Ergänzend muss ich darauf hinweisen, dass Firebird Probleme hat mit verschachtelten SubSelects oder IN-Prüfungen bei WHERE-Klauseln und sich gerne aufhängt. Nach Erledigung dieses Problems kommen noch ein weiterer JOIN und eine WHERE-Klausel hinzu; aber die sind unproblematisch. Könnt Ihr mir einen Weg nennen? Danke! Jürgen |
Re: SELECT JOIN MIN richtig kombinieren?
Hallo Jürgen,
ich denke, dass du einfach ein MIN(PLZ.PLZ) mit in die Selektion aufnehmen und die passende GROUP BY Klausel ergänzen musst. Grüße vom marabu |
Re: SELECT JOIN MIN richtig kombinieren?
Das hatte ich auch gehofft:
SQL-Code:
Das liefert (getestet im SQL-Fenster von IBExpert):
SELECT ORTE2.Name, ORTE2.Alort,
MIN(PLZ.PLZ), PLZ.Plz_Art, PLZ.Str-Verz FROM ORTE2 JOIN PLZ ON PLZ.Alort = ORTE2.Alort GROUP BY PLZ.PLZ Zitat:
Jürgen |
Re: SELECT JOIN MIN richtig kombinieren?
Wenn Du Aggregatfunktionen (hier MIN) verwendest, musst Du nach allen Nicht-Aggregatfeldern gruppieren.
|
Re: SELECT JOIN MIN richtig kombinieren?
Zitat:
SQL-Code:
Zuerst wird offensichtlich das JOIN ausgeführt, und das führt zu doppelten Einträgen (alle PLZ zur gleichen Ort-ID/Alort). Erst danach kommt die Gruppierung mit MIN, und das hat natürlich keine "echten" Auswirkungen mehr.
SELECT ORTE2.Name, ORTE2.Alort,
MIN(PLZ.PLZ), PLZ.Plz_Art, PLZ.Str-Verz FROM ORTE2 JOIN PLZ ON PLZ.Alort = ORTE2.Alort GROUP BY PLZ.PLZ, /* ergänzt um: */ ORTE2.Name, ORTE2.Alort, PLZ.Plz_Art, PLZ.Str-Verz Nochmal: Beim JOIN will ich nur einen Eintrag aus PLZ holen, nämlich die kleinste PLZ. Jürgen |
Re: SELECT JOIN MIN richtig kombinieren?
Nimm das PLZ.PLZ mal aus der Gruppierung heraus, das macht an der Stelle keinen Sinn.
|
Re: SELECT JOIN MIN richtig kombinieren?
Zitat:
|
Re: SELECT JOIN MIN richtig kombinieren?
Schau Dir mal
![]() |
Re: SELECT JOIN MIN richtig kombinieren?
Danke, DeddyH, das war ein sehr hilfreicher Hinweis.
Ich habe das erst einmal so eingebaut:
SQL-Code:
Das Ergebnis sieht recht gut aus, aber so stimmt es vermutlich noch nicht: Im Ergebnis erhalte ich nur 41.000 Datensätze, aber nach meiner Schätzung dürfte von den 95.000 Einträgen in ORTE2 nur ein kleiner Teil herausfallen. Das werde ich morgen weiter untersuchen und mich dann wieder melden.
SELECT ORTE2.Name, ORTE2.Alort,
p1.PLZ, p1.Plz_Art, p1.Str-Verz FROM ORTE2, PLZ p1 WHERE (p1.Alort = ORTE2.Alort) AND (p1.Plz = (SELECT MIN(PLZ) FROM PLZ p2 WHERE p2.Alort = p1.Alort)) Danach muss die Abfrage noch optimiert werden (ist nicht auch dabei ein JOIN möglich?), auch wegen der Feststellungen des Analyse-Plans. Schönes Wochenende erstmal! Jürgen |
Re: SELECT JOIN MIN richtig kombinieren?
Hallo Jürgen,
ich versuche mich jetzt auch mal dran...
SQL-Code:
Da du leider nichts über die beiden Spalten (plz_art und str_verz) verraten hast, ist diese Abfrage vielleicht problematisch und fehlerhaft.
SELECT o.name, o.alort,
p.plz, p.plz_art, p.str_verz FROM orte2 o INNER JOIN (SELECT alort, plz_art, str_verz, MIN(plz) plz FROM plz GROUP BY alort, plz_art, str_verz) p ON o.alort = p.alort Deshalb gleich noch ein Versuch, der diese Problematik umgeht...
SQL-Code:
Gruss
SELECT o.name, o.alort,
p.plz, p.plz_art, p.str_verz FROM orte2 o INNER JOIN (SELECT alort, plz_art, str_verz, plz FROM plz p WHERE plz = (SELECT MIN(plz) FROM plz WHERE alort = p.alort)) p ON o.alort = p.alort Thorsten |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz