Anzeige von offenen Feldern mit <null>

Hallo ich hab noch ein Problem und keiner meiner Kollegen konnte helfen.
Vereinfacht dargestellt verhält es sich wie folgt:
Ich habe drei Tabellen

  • t_customers
  • customer_no (key)
  • customer_name
  • t_customer_accounts
  • customer_no (key)
  • depot_no (key)
  • t_constellation
  • customer_no (key)
  • depot_no (key)
  • constellation_ID
  • cash_account_no
    In diesen Tabellen kann es nur einen Kunden mit einer customer_no geben. Ein Kunde kann mehrere depot_no und mehrere constellation_id’s haben.
    Mein Problem ist nun, dass ich einen Kunden habe, der mehrere depot_no hat, aber nicht alle depot_no haben eine constellation_no.

Dieses Ergebnis würde ich erwarten
customer_no | depot_no | constellation_id | cash_account_no
… | | |
1010 | 11111 | 15 | 111
1010 | 12345 | 30 | 123
BTFS |555555 | 70 | 555
BTFS 666666

Stattdessen wird für den kd2 die gleiche constellation_id für das zweite Depot angezeigt, obwohl für das zweite Depot gar keine constellation_id da ist.
Das Ergebnis bekomme ich, ist aber natürlich falsch:

customer_no | depot_no | constellation_id | cash_account_no
… | | |
1010 | 11111 | 15 | 111
1010 | 12345 | 30 | 123
BTFS | 555555 | 70 | 555
BTFS |666666 | 70 | 555

Hier ein paar Beispieldaten:
t_customers:
customer_no | name_1
1010 | DIRAAT
1020 | Meiner
BFTS | Irgendwas

t_customer_accounts:
customer_no | depot_no
1010 | 11111
1010 | 12345
1020 | 444444
BFTS | 555555
BFTS 666666

t_constellation:
customer_no | depot_no | constellation_id | cash_account_no
1010 | 11111 | 15 | 111
1010 | 12345 | 30 | 123
1020 | 444444 | 20 | 4444
BFTS | 555555 | 70 | 555

Hier mein SQL:
select
ca.customer_no as “Customer No”,
ca.depot_no as “Depot No”,
con.constellation_id as “Konstellation”,
con.cash_account_no as “Geldkonto”
from customer_accounts ca,
accounts a,
customers c,
constellation con
where
a.account_no = ca.depot_no
and c.customer_no = ca.customer_no
and con.customer_no = c.customer_no
Wenn ich dann noch die Zeile
and con.account_no = a.account_no
einfüge, dann zeigt er mir das zweite BTFS-Depot nicht mehr an.

Allgemein:

  • Deine Tabellen sind schwer zu indentifizieren, die Tabellendefinitionen passen nicht zum select
  • im select sind Spalten nicht eindeutig Tabellen zuordenbar
  • es ist praktisch, JOINs als solche im Select direkt zu definieren:
test=# select * from customer_accounts;
 customer_no | depot_no
-------------+----------
 1010        | 11111
 1010        | 12345
 1020        | 444444
 BTFS        | 555555
 BTFS        | 666666
(5 rows)

test=# select * from t_constellation;
 customer_no | depot_no | constellation_id | cash_account_no
-------------+----------+------------------+-----------------
 1010        | 11111    | 15               | 111
 1010        | 12345    | 30               | 4444
 1020        | 444444   | 20               | 4444
 BTFS        | 555555   | 70               | 555
(4 rows)

test=# select a.customer_no, a.depot_no, b.constellation_id, b.cash_account_no from customer_accounts a left join t_constellation b on ((a.customer_no,a.depot_no)=(b.customer_no,b.depot_no));
 customer_no | depot_no | constellation_id | cash_account_no
-------------+----------+------------------+-----------------
 1010        | 11111    | 15               | 111
 1010        | 12345    | 30               | 4444
 1020        | 444444   | 20               | 4444
 BTFS        | 555555   | 70               | 555
 BTFS        | 666666   |                  |
(5 rows)

Ich vermute mal, dies ist, was Du suchst. Ob die Syntax unter ORA auch so klappt, mußt Du selbst ergründen.


Andreas