dedlfix: Abfrage OpenGeoDB, postleitzahlen groupieren?

Beitrag lesen

Tach!

Wenn ich das einfüge wie oben geschehen kommt, als Antwort die betreffende loc_id. Was erwünscht ist, doch wie wiederum, kann ich zu diese Loc_id, auch den Namen wie bei der Abfrage

Als erstes wäre da, die Aufgabe in Einzelteile herunterzubrechen. Du bekommst also bei einem bestimmten Statement eine bestimmte Antwort und die ist noch nicht das Ziel sondern nur ein Zwischenschritt.

Ausgangspunkt ist eine loc-id aus der Haupt-Query. Die nehmen wir erstmal als festen Wert (42 fürs Beispiel). Eine Abfrage mit dieser id und dem Typ 400100000 ("Teil von") ergibt die loc-id der übergeordneten Einheit. Und damit kannst du dann weitere Detaildaten zu dieser abfragen. Diese Abfragen kannst du jeweils als einzelne Querys formulieren. Dazu setzt du das Ergebnis aus der vorherigen Abfrage erstmal zu Fuß in den WHERE-Teil der nächsten Query. Wenn die einzeln Querys wie gewünscht arbeiten, kannst du nun rückwärts gehen und sie als Subquerys in die vorhergehende einfügen, da wo das Ergebnis hinkommen soll. Statt dem händischen Wert muss nun ein Bezug zur übergeordneten Query über deren entsprechendes Feld hergestellt werden. Die ganze Geschichte verschachtelt sich in dem Fall. Und du brauchs sie mehrfach, wenn mehrere Daten aus der übergeordneten Einheit abgefragt werden sollen.

Alternativ zu dieser Vermehrung kannst du die Query für die übergeordneten Daten erstmal separat erstellen (nach dem bisherigen Subquery-Prinzip), so dass du je loc-id einen Datensatz erhältst. Dieses Gebilde kannst du dann als Subquery in den FROM-Teil bringen und einen Join zur Haupt-Query erstellen. Insgesamt nicht schön, aber ...

Die Tabelle hat ein nicht ganz günstiges Format für solche Abfragen, aber so ist sie nun mal aufgebaut. Ihre Struktur ist einfach, dafür aber sehr erweiterbar. Eine Empfehlung des Projektes lautet auch, sich eine eigene Struktur anzulegen, die für den eigenen Anwendungsfall besser geeignet ist und die Daten dahinein zu transformieren. Dann hat man den komplexen Teil zwar immer noch, ihn aber in die Transformationsroutine delegiert, und kann mit einfacheren Abfragen im eigenen Projekt arbeiten. Das lohnt sich vermutlich aber erst dann, wenn man Geschwindigkeitsprobleme mit der Originaldatenstruktur bekommt.

Das Prinzip sieht dann so aus, wenn die Aufgabe wäre, Name und Einwohner eines Ortes und dessen übergeordneter Einheit zu ermitteln.

SELECT 
    loc-id, 
    (Subquery für Name zu loc-id),
    (Subquery für Einwohner zu loc-id),
    (Subquery für Name zu (Subquery für TeilVon zu loc-id)),
    (Subquery für Einwohner zu (Subquery für TeilVon zu loc-id))
FROM ...

oder

SELECT 
    loc-id, 
    (Subquery für Name zu loc-id),
    (Subquery für Einwohner zu loc-id),
    übergordnet.Name,
    übergordnet.Einwohner
FROM tabelle AS haupt 
LEFT JOIN (
    SELECT 
        (Subquery für Name zu loc-id) AS Name,
        (Subquery für Einwohner zu loc-id) AS Einwohner,
    FROM tabelle
) AS übergeordnet ON übergeordnet.loc-id = haupt.TeilVon
WHERE ...

dedlfix.