dedlfix: Datenbanken

Beitrag lesen

Tach!

Später will ich so joinen, dass ich für jedes Gebäude und Jahr eine Tabelle Jahresabrechnung( Bezeichnung, Kosten) projezieren kann.

Brauchst du wirklich die Gebäudedaten in jeder Zeile der Ausgabe, oder reicht es, wenn diese einmal als Gruppenüberschrift in der Ausgabe stehen?

Wenn letzteres, dann kannst du die Gebäude separat abfragen und einzelne Abfragen je Gebäude auf die Ausgabentabelle ausführen. Normalerweise macht man sowas nich, weil es dann viele statt einer Abfrage sind. Aber ist das denn in deinem Fall relevant? Verwaltest du alle Häuser einer Großstadt oder nur eine Handvoll?

Natürlich kannst du auch die Gebäudedaten in die Ausgabe joinen, aber wenn du sie nur für Gruppenbildung brauchst, musst du hinterher mit einem Gruppenwechsel rangehen, um das nächste Gebäude zu erkennen.

Es macht mir jedoch etwas zu schaffen, dass die Kardinalitäten m:n sind.

Eigentlich hast du nur zwei 1:n-Beziehungen: Ausgaben zu Gebäude und Ausgaben zu Ausgabetyp. Zwischen Gebäude und Ausgabetyp gibt es nicht wirklich eine Beziehung. Und selbst wenn du für jedes Gebäude eine Liste der Ausgabetypen erstellen möchtest, kannst du das über die beiden Einzelbeziehungen problemlos abfragen.

  1. Kann ich einen Nichtschlüsselattribut als Fremdschlüssel nehmen? Also Ausgabentyp-ID oder Gebäude-Id in Ausgaben?

Ja, klar. Sonst wäre es unmöglich, eine 1:n-Beziehungen zu modellieren, wenn man nur Primärschlüssel miteinander verknüpfen könnte.

  1. Müssen Ausgabentyp-ID und Gebäude-ID in Ausgaben einzigartig sein?

Nein. Können sie nicht, weil sie sich pro Jahr wiederholen. Und selbst pro Jahr müssen/können sie nicht eindeutig sein, wenn du mehrere Ausgaben vom selben Typ pro Jahr und Gebäude hast, so wie das ja in der Realität nicht unüblich ist.

Hoffe mir kann einer Sagen wie das geht.

Wenn man Daten miteinander verknüpfen möchte, kommt man meist sehr schnell auf Join als Antwort. Das ist aber nicht die einzige Möglichkeit, Daten aus anderen Tabellen heranzuziehen. Wenn wie bei dir der Ausgabetyp lediglich ein einzelner Name ist, der beim Abfragen der Ausgabentabelle statt der Ausgabentyp-ID angezeigt werden soll, kannst du den auch mit einer correlated subquery in die Ergebnismenge holen. Der Vorteil ist, dass du nicht erst ein Join-Monster bilden musst, für das die Syntax an mehreren Stellen der Query verteilt werden muss, sondern dass du eine Subquery gebündelt dastehen hast. Und diese kannst du bei Bedarf auch recht einfach rauskopieren und separat testen kannst, und das gilt sowohl für die Grund-Query als auch für die Subquery. Oder andersrum, dass du die Abfragen zunächst separat erstellst und prüfst und sie dann miteinander kombinierst. Bei Joins geht so eine getrennte Vorgehensweise nicht. Zudem kann man sich Probleme mit ungewollten kartesischen Produkten einfangen, wenn man nicht richtig joint.

Correlated Subquerys können aber immer nur dann verwendet werden, wenn lediglich ein einzelnes Feld für die Ausgabe relevant ist. Oder du schreibst für jedes Feld eine eigene Subquery, was aber die Query aufbläht.

Erst einzeln zum Testen

SELECT felder FROM Ausgaben
SELECT Bezeichnug FROM Ausgabetypen WHERE ID = 1

Dann miteinander verbinden:

SELECT felder,
(SELECT Bezeichnung FROM Ausgabetypen WHERE ID = a.Ausgabentyp)
FROM Ausgaben a

dedlfix.