Inner Join 3 Tabellen mit gleichen IDs

bennot

Mitglied
Hallo Datenbank Freunde,

ich habe folgende Tabellen und bin auf der Suche nach einem finalen Tipp. Denn meine Abfrage macht nicht das was sie machen soll.

In der Tabelle Person werden Personen mit einer ID und Namen abgespeichert.
In der Tabelle Partner wird eine Partnerschaft über die Personen IDs eingetragen.
In der Tabelle Kind werden Kinder mit einem Namen angelegt, die eine Mutter und einen Vater haben können. Mutter und Vater sind wieder die IDs aus der Tabelle Person.


Ich versuche z. B. folgendes Ergebnis zu erhalten:

[P_ID] [P_NAME] [P_NAME vom Partner] [K_Name vom Kind]

Tabelle 1 Person:
P_ID, P_NAME

Tabelle 2 Partner:
P_ID_1, P_ID_2

Tabelle 3 Kind:
K_NAME, K_MUTTER, K_VATER

Meine Abfrage:
Code:
SELECT DISTINCT
    p1.p_id,
    p1.p_name as pn1,
    p2.p_name as pn2,
    kind.k_name
FROM
person as p1,
person as p2,
partner,
kind
JOIN
person
ON
p_id = person.p_id
WHERE
p1.p_id = partner.pa_p_1
AND
p2.p_id = partner.pa_p_2
AND
p1.p_id = kind.k_mutter
OR
p2.p_id = kind.k_vater

Das ganze klappt soweit ganz gut.
Ergebnis der ersten Zeile stimmt. Danach kommen falsche Angaben, die so nicht in der Tabelle eingetragen sind. Die Namen werden wild durch gemixt und das Kind ist falsch.



Was mach ich falsch? Vielen Dank
 
Zuletzt bearbeitet von einem Moderator:
Code:
SELECT DISTINCT
    p1.p_id,
    p1.p_name as person,
    p2.p_name as partner,
    ki.k_name as kindname
FROM
person p1,
person p2
JOIN
partner pa
ON
(p2.p_id = pa.pa_p_1 OR p2.p_id = pa.pa_p_2 )
JOIN
kind ki
ON
(p2.p_id = ki.k_mutter)
WHERE p1.p_id = pa.pa_p_2

UNION

SELECT DISTINCT
    p1.p_id,
    p1.p_name as person,
    p2.p_name as partner,
    ki.k_name as kindname
FROM
person p1,
person p2
JOIN
partner pa
ON
(p2.p_id = pa.pa_p_1 OR p2.p_id = pa.pa_p_2 )
JOIN
kind ki
ON
(p2.p_id = ki.k_vater)
WHERE p1.p_id = pa.pa_p_1

UNION

SELECT
    p_id,
    p_name as person,
    null,
    null
FROM
person,
partner,
kind
WHERE
p_id != pa_p_1 AND p_id != pa_p_2 OR p_id != k_mutter AND p_id != k_vater
ORDER BY p_id

Eine sicherlich unschöne Lösung. Aber sie funktioniert.

Bin gerne für Verbesserungsvorschläge offen.
 
Zuletzt bearbeitet von einem Moderator:
Bist du dir sicher, dass das funktioniert? Überprüfe mal den Fall Partner1=Vater, ich glaube das geht bei dir oben nicht (nicht getestet, rein Überlegungssache). Wenn du schon eine Mapping-Tabelle (Partner) hast, dann würde ich doch diese als Ausgangspunkt verwenden und nicht Person1xPerson2.

Ehrlich gesagt frage ich mich jedoch, warum es hier überhaupt 3 Tabellen gibt. Reicht nicht eine Personen Tabelle aus, welche Verknüpfungen zu sich selbst hat? Das würde meines Erachtens vieles leichter machen.
z.B.: PERSON_ID, PERSON_NAME, PARTNER_ID, MUTTER_ID, VATER_ID
 
Hallo HonniCiles,

vielleicht hast du recht und ich sollte die Tabellen noch mal umstrukturieren. ich mache mir noch mal Gedanken.

Vielen Dank für den Denkanstoß.


EDIT:
Alle Probleme dank der Übernahme der Partner Tabelle in die Personen Tabelle gelöst.

Code:
SELECT person.p_id, person.p_vorname, person.p_name, person.p_strasse, person.p_plz, person.p_ort, person.p_firma, person.p_email, person.p_coment, partner.p_vorname as partner_vorname, partner.p_name as partner_name, kind.k_vname, kind.k_name FROM person JOIN kind ON person.p_id = kind.k_mutter OR person.p_id = kind.k_vater JOIN person as partner ON person.p_id = partner.p_id
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück