Normalisierungsproblem: Information in tiefer liegende Ebene verschieben

winnewoerp

Benutzer
Beiträge
9
Hallo Datenbankmodellierungs-Experten,

ich habe folgende nicht normalisierte Daten vorliegen (inhaltlich verändertes sowie reduziertes Abbild einer tatsächlichen Aufgabe). Die PLZ-Spalten sind dabei teilweise mit Mehrfachwerten (leerzeichengetrennt) belegt.

gemeinde.csv

Code:
gemeindecode,gemeindename,plz_verwaltungssitz,weitere_plz
1001,Ahausen,25001,25002 25003
1002,Bdorf,25004,25003
1003,Cfeld,25003,
1004,Dberg,25003,
1005,Estadt,25005,25006
1006,Fheim,25007,

ortsteil.csv

Code:
ortsteilcode,gemeindecode,ortsteilname,plz
100101,1001,Klein Ahausen,25001 25002
100102,1001,Groß Ahausen,25003
100103,1001,Neuahausen,25002
100201,1002,Bdorf,25003 25004
100202,1002,Bdorfermühle,25004
100301,1003,Cfeld,25003
100401,1004,Dberg,25003
100501,1005,Altenestadt,25005 25006
100502,1005,Unterestadt,25005 25006
100503,1005,Oberestadt,25005 25006
100504,1005,Estadt-Ausbau,25006
100601,1006,Fheim,25007
100602,1006,Fheimerau,25007

Nun möchte ich daraus möglichst konsequente Tabellen generieren, bei denen es mit SQL/SQLite möglich wäre, die oben dargestellte Struktur wieder abzubilden. Idee: gemeinde, ortsteil und ortsteil_plz (plz benötige ich in diesem Fall nicht als eigene Entität). In einem ersten Umsetzungsdurchgang sieht das so aus:

gemeinde.png
ortsteil.png
ortsteil_plz.png
Nun möchte ich "nur" noch die Information, welches die Postleitzahl des Verwaltungssitzes ist, in die Tabelle ortsteil_plz hinzufügen und dann bei der Gemeinde entfernen.

Folgende SQL-Abfrage habe ich erstellt:

Code:
SELECT
  1 AS is_plz_verwaltungssitz,
  g.plz_verwaltungssitz,
  o.ortsteilname AS ortsteil_name
FROM ortsteil_plz o_p
INNER JOIN ortsteil o ON o_p.ortsteilcode = o.ortsteilcode
INNER JOIN gemeinde g ON o.gemeindecode = g.gemeindecode
WHERE o_p.plz = g.plz_verwaltungssitz;

is_plz_verwaltungssitz.png
Die 1 von is_plz_verwaltungssitz hätte ich nun gerne in allen passenden Zeilen der oben gezeigten dritten Tabelle in der betreffenden Spalte. Wie bekomme ich sie dahin?

Der Anfang lautet UPDATE ortsteil_plz SET is_plz_verwaltungssitz = 1 WHERE [...], aber wie geht es dann weiter? Hat jemand eine Idee?

Danke und viele Grüße
winnewoerp
 
Zuletzt bearbeitet:
Werbung:
Das war jetzt einiges an Getüftel, aber hier ist die Lösung:

Code:
UPDATE ortsteil_plz
SET is_plz_verwaltungssitz = 1
WHERE plz = (
  SELECT g.plz_verwaltungssitz
  FROM ortsteil_plz o_p
  INNER JOIN ortsteil o ON o_p.ortsteilcode = o.ortsteilcode
  INNER JOIN gemeinde g ON o.gemeindecode = g.gemeindecode
  WHERE o_p.plz = g.plz_verwaltungssitz
  AND o_p.plz = ortsteil_plz.plz
  AND o_p.ortsteilcode = ortsteil_plz.ortsteilcode
);

Die Bedingungen der Unterabfrage waren hier für mich nicht einfach zu ermitteln, da sowohl Abgleiche innerhalb der Unterabfrage als auch solche zwischen Unterabfrage und übergeordneter Ebene erfolgen müssen. Der Knackpunkt war dabei auch, dass ich nicht wusste, wie man in der Unterabfrage die Tabellen-Instanz der übergeordneten Ebene referenziert, da man bei UPDATE ja keinen Alias vergeben kann. Ich war vorher davon ausgegangen, dass die Verwendung des originalen Tabellennamens neben o_p in der Unterabfrage zu einem Fehler führt, da hier mit ortsteil_plz ja auch die Tabellen-Instanz der Unterabfrage gemeint sein könnte. Allerdings ist es ja anscheinend so, dass die Unterabfrage nur noch auf den Alias o_p "hört", was natürlich hier nützlich ist, da damit eine gute Möglichkeit gegeben ist, WHERE-Klauseln mit Bezug zur übergeordneten Ebene zu erstellen, ohne einen Tabellen-Alias aus dieser Ebene verfügbar zu haben.
 
Zurück
Oben