Problem mit JOIN / LEFT JOIN

FrenchSpirit

Aktiver Benutzer
Beiträge
41
Hallo liebe Experten,

ich habe ein Problem, an dem ich mir seit ein paar Stunden den Kopf zerbreche. Ich danke euch vorab dafür, dasss ihr meinen etwas längeren Thread lest und hoffe, dass ich es verständlich aufgeschrieben habe. (Leider weiss ich nicht wie ich die Tabellen grafisch skizzieren kann (ggf. Screenshot meines Notizzettels?)

Es gibt folgende Tabellen:

- Tabelle PE (Personendaten)
- Tabelle KTO (Kontendaten, verknüpfbar mit Personendaten)
- Tabelle GKB (Basisdaten Information, verknüpfbar mit Personendaten)
- Tabelle GKD (Detaildaten Information, verknüpfbar über ID zwischen GKB und GKD)

In der Tabelle GKD ist zusätzlich eine Spalte mit einem Wert enthalten, die der Kontonummer entspricht.

In der PE finde ich z.B. die Person 4711

In der KTO finde ich die Info, dass die Person 4711 die Konten 2530 und 5400 hat.

In der GKB finde ich die Info, dass die Person 4711 die INFO ID 1 und die INFO ID 2 hat.

In der GKD finde ich die Info, dass in der INFO ID1 der Wert 2530 in einem bestimten Feld steht. Auch ist in der INFO ID2 irgendwo der Wert 5400 drin.

Dies habe ich mit folgendem SQL hingebkommen:


SELECT

PE.PERSONEN_NR
, KTO.KONTONR
, GKB.GEN_KONSTR_ID
, GKD.WERT_CHAR AS GEKO_KTONR

FROM T_PERSON PE

JOIN Z_KONTEN_ALLE_AZ KTO
ON KTO.PERS_NR = PE.PERS_NR

JOIN GEN_KONSTR_BASIS GKB
ON PE.PERS_NR = GKB.BEZUGS_OBJEKT_ID
AND GKb.SATZART_GP IN (8436)

JOIN GEN_KONSTR_DATEN GKD
ON GKB.GEN_KONSTR_ID = GKD.GEN_KONSTR_ID
AND GKD.FZ = '0020'
AND GKD.WERT_CHAR = KTO.KONTONR

Es wird folgendes Ergebnis geliefert:

PE // KTO // GK ID // INFO
4711 // 2350 // 1 // 02350
4711 // 5400 // 2 // 05400


Mein Problem ist, dass ich anstelle des Joins "irgendwie" einen Leftjoin benötige, da es ja sein kann, dass es zwar das KTO 5400 gibt, es aber in der Tabelle GKB die INFO ID 2 nicht gibt.

Wenn ich beide Male anstelle des JOIN den LEFT JOIN nehme, bekomme ich die Ergebniszeilen potenziert angezeigt:

PE // KTO // GK ID // INFO
4711 // 2350 // 1 // 02350
4711 // 2350 // 2 // 05400
4711 // 5400 // 1 // 02350
4711 // 5400 // 2 // 05400

Das ist sehr unübersichtlich. Wie kann ich es hinbekommen, dass mir definitiv alle Konten (nur Einmal) angezeigt werden, ich in den Ergebnisspalten GK ID und INFO Leerfelder bekomme, wenn eben die INFO ID nicht da ist???

Herzlichen Dank vorab,

Spirit

.
 
Werbung:
In der PE finde ich z.B. die Person 4711
In der KTO finde ich die Info, dass die Person 4711 die Konten 2530 und 5400 hat.
In der GKB finde ich die Info, dass die Person 4711 die INFO ID 1 und die INFO ID 2 hat.
In der GKD finde ich die Info, dass in der INFO ID1 der Wert 2530 in einem bestimten Feld steht. Auch ist in der INFO ID2 irgendwo der Wert 5400 drin.

Warum ist die Info, daß Person 4711 die Konten 2530 und 5400 hat, in zwei Tabellen(GKB, GKD) gespeichert?
 
Hallo akretschmer,
danke, dass Du Dich damit beschäftigt hast.

Die Informationen bestehen aus mehreren (unterschiedlichen) Zeilen pro Information.

In der Tabelle GKB steht quasi nur drin (nur ein Datensatz für jede Info ID):

Person // GK ID
4711 // 1


In der Tabelle GKD werden die Infos aufgeschlüsselt, d.h. es gibt pro ID mehrere (bis zu 50) Datensätze. Beispiel:

GK ID // Feldziffer // Wert
1 // 0010 // 5
1 // 0020 // 02350
1 // 0040 // Berta
1 // 0090 // 1500000

usw.

Bei den von mir genutzten Informationen ist die erfasste Kontonummer (Eingabemaske im Userfrontend) in der Feldziffer 0020 zu der erfassten ID hinterlegt.

Gruß

Spirit
 
In der Tabelle GKB steht quasi nur drin (nur ein Datensatz für jede Info ID):

Person // GK ID
4711 // 1


In der Tabelle GKD werden die Infos aufgeschlüsselt, d.h. es gibt pro ID mehrere (bis zu 50) Datensätze. Beispiel:

Das ist wohl die Ursache Deiner Probleme...

GK ID // Feldziffer // Wert
1 // 0010 // 5
1 // 0020 // 02350
1 // 0040 // Berta
1 // 0090 // 1500000

usw.

Bei den von mir genutzten Informationen ist die erfasste Kontonummer (Eingabemaske im Userfrontend) in der Feldziffer 0020 zu der erfassten ID hinterlegt.

Joine nicht gegen die Tabelle selbst, sondern gegen einen Subselect. In etwa:

... join (select * from gkd where feldziffer = 20) bla on ...
 
Werbung:
Hallo, akretschmer,
prima. Das mit dem Subselekt werde ich testen. In Access habe ich sehr oft mit mehreren Unterabfragen gearbeitet, um zum Ergebnis zu kommen. Mit den Subselekts in einem Statement tue mich mich dagegen immer noch sehr schwer :///

Danke!
 
Zurück
Oben