Erzeugen der Zuordnungstabelle
Du hast es sicherlich gemerkt. Beide Vorgehensweisen - zusätzlicher Join über die Mailadresse bzw. über das Geburtsdatum - bringen nicht das gewünschte Ergebnis.
Das wäre eigentlich nicht schlimm - bedeutet es doch nur, dass wir 4 oder 5 von ca. 170 Karten nicht zuordnen könnten, also unter 3%. Bei großen Datenmengen wäre das vollkommen in Ordnung, es geht uns ja um "das große Ganze" und da könnten wir mit diesem Fehler leben.
Sichern der Zuordnung als Zuordnungstabelle
Das Ergebnis, die Zuordnung zwischen Zahlkarte und Person, wollen wir uns für die Zukunft sichern. Wie schon im ersten Kapitel geht das entweder als (statische) Tabelle oder als (dynamischer) View.
Mit folgendem SQL-Befehl erzeugst du eine neue Tabelle, die die Zuordnung enthält:
CREATE TABLE znrpnr as
SELECT z_karte.ZNR, m_person.PNR
FROM z_karte, m_person
WHERE z_karte.Mail = m_person.EMail
AND z_karte.Familienname = m_person.Name
AND z_karte.Vorname = m_person.Vorname
UNION
SELECT z_karte.ZNR, m_person.PNR
FROM z_karte, m_person
WHERE z_karte.GebDatum = m_person.GebDat
AND z_karte.Familienname = m_person.Name
AND z_karte.Vorname = m_person.Vorname
Der Befehl CREATE TABLE
ist selbsterklärend. Vielleicht erkennst du auch deine beiden
SQL-Befehle wieder, die du im letzten Kapitel hoffentlich selbst hinbekommen hast.
Neu ist der Befehl UNION
in Zeile 7. Er stellt eine Mengenoperation auf den
Abfrageergebnissen dar:
Erzeugen eines Zuordnungs-View
Die Tabelle hat den Vorteil, dass ein Zugriff darauf sehr schnell möglich ist; die Abfragen werden nicht neu ausgeführt. Das ist aber auch wieder genau der Nachteil, sollten sich die Ausgangsdaten ändern. Daher kann alternativ auch wieder ein Datenbank-View verwendet werden:
CREATE VIEW v_znrpnr as
SELECT z_karte.ZNR, m_person.PNR
FROM z_karte, m_person
WHERE z_karte.Mail = m_person.EMail
AND z_karte.Familienname = m_person.Name
AND z_karte.Vorname = m_person.Vorname
UNION
SELECT z_karte.ZNR, m_person.PNR
FROM z_karte, m_person
WHERE z_karte.GebDatum = m_person.GebDat
AND z_karte.Familienname = m_person.Name
AND z_karte.Vorname = m_person.Vorname
Aufgabe
In der online-Datenbank sind beide Varianten schon vorhanden, also die Tabelle znrpnr
und der View v_znrpnr
.
Probiere einmal aus, ob es einen Unterschied macht, wenn man Tabelle oder View verwendet:
- Suche alle Einträge in Tabelle oder View, die zur Person "Carlo Winkelmann" gehören.
- Wann hat Herr Winkelmann eingekauft und wo?