Auslesen einer n:m Beziehung

Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

tklustig

Erfahrenes Mitglied
Hallo Leute,
habe folgendes n:m Beziehung in einem relationalen Datenbanksystem:
ERD.jpg
Meine Intention ist es, sowohl name als auch filename für denjenigen Record zu erhalten, für den gilt: patient.id=1.
Wie lautet das Query? Folgendes funktioniert nicht:
SELECT name,filename FROM patient,dateianhang LEFT JOIN patient_has_dateianhang ON patient.id =patient_has_dateianhang.Patient_id WHERE patient.id=1;
 

Yaslaw

n/a
Moderator
ARGL. Nenn das Feld nicht name. Es geht, aber name ist in fast allen Programmiersprachen auch ein Attribut und kann zu ungeahnten Problemen führen.

Zu deinem Problem.
Left join von der patient_has_dateianhang zu dateinanhang ist ok, doch mMn verkehrt. In deiner Logik ist patient_has_dateianhang der Ausgangspunkt. Und brauchst du wirklich LEFT JOIN? Oder reicht ein INNER JOIN?
Zudem verbinbdest du in deinem LEFT JOIN dateianhang und nicht patient. Da kannst du nachher nicht im ON auf den Patient zugreifen.
Und wie soll herausgefunden werden, welcher Patient es betrifft?
Du brauchs auch ein LEFT JOIN zum Patienten.

Mit was für einer DB arbeitest du? MySQL, MS Access, Oracle?

PS: SQL als Einzeiler - unlesbar.
SQL:
-- Fast alle Datenbankentypen. Mir bekannte Ausnahme: MS Access
SELECT patient.name, dateianhang.filename
FROM
    patient_has_dateianhang
    LEFT JOIN patient
        ON patient.id =patient_has_dateianhang.Patient_id
    LEFT JOIN dateianhang
        ON dateianhang.id =patient_has_dateianhang.dateianhang_id
WHERE patient.id=1

-- Version für MS Access
SELECT patient.name, dateianhang.filename
FROM
    (
        patient_has_dateianhang
        LEFT JOIN patient
            ON patient.id =patient_has_dateianhang.Patient_id
    ) LEFT JOIN dateianhang
        ON dateianhang.id =patient_has_dateianhang.dateianhang_id
WHERE patient.id=1

--Falls auch ein INNER JOIN genügt
SELECT patient.name, dateianhang.filename 
FROM 
    patient_has_dateianhang, patient, dateianhang 
WHERE 
    patient.id =patient_has_dateianhang.Patient_id
    AND dateianhang.id =patient_has_dateianhang.dateianhang_id
    AND patient.id=1

-- Mit LEFT JOIN, eine weitere Möglichkeit in Oracle-Datenbanken
SELECT patient.name, dateianhang.filename 
FROM 
    patient_has_dateianhang, patient, dateianhang 
WHERE 
    patient_has_dateianhang.Patient_id = patient.id(+)
    AND patient_has_dateianhang.dateianhang_id = dateianhang.id(+)
    AND patient.id = 1
 

tklustig

Erfahrenes Mitglied
Okay. du hast vollkommen Recht. Habe die Propertie über ein ALTER TABLE umbenannt. Benutze im übrigen MySQL, so dass Dein zweites Query das Korrekte darstellt. Ausgehend von patient_has_dateianhang und der Verknüpfung mit allen Relationen kommt das gewollte Resultat zu Stande. Hier nochmals das Query:
SELECT namen, filename FROM patient_has_dateianhang LEFT JOIN patient ON patient.id =Patient_id LEFT JOIN dateianhang ON dateianhang.id =dateianhang_id WHERE namen="Krüger";
 
Zuletzt bearbeitet:

Zvoni

Erfahrenes Mitglied
Ach wenn "gelöst": Was ich nicht verstehe ist, wieso du eine "n:m"-Beziehung hast.
Kann ein Dokument auch mehreren/anderen Patienten zugeordnet sein (Was für mich nicht wirklich Sinn ergibt)?
Da es sich anscheinend um Patienten-Daten handelt, kann ich mir nicht wirklich vorstellen, das ein und dasselbe Dokument für mehrere Patienten gelten soll, da solche Daten/Dokumente zu "individuell" sein dürften.
 

tklustig

Erfahrenes Mitglied
Doch, kann es, in Form von Rundschreiben. Wenn Person A an Person B/C/D ->n beispielsweise ein Dokument verschicken will, dass die Praxis geschlossen ist, benötige ich eine m:n Beziehung.
 

Zvoni

Erfahrenes Mitglied
Ah, OK.
Klar, wenn du "generische" Dokumente hast, welche tatsächlich jedem Patienten zugeordnet werden sollen, dann ja: n:m-Beziehung.
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…