Search code examples
sqloraclejoinora-00942

LEFT JOIN on multiple tables ERROR! (Table or view does not exist)


I have the following SQL Syntax:

  SELECT firmenstamm.firmen_id,   
     firmenstamm.firmenname_1,   
     kreditorenstamm.kreditorenname_1,   
     debitor.debitoren_id,   
     debitor.deb_id_vom_kreditor,   
     debitorenstamm.debitorenname_1,   
     zahlung.zahlung_nr,   
     zahlung.zahlung_betrag,   
     zahlung.zahlung_betrag_offen,   
     zahlung.zahlung_datum,   
     kreditorenstamm.kreditoren_id,   
     bankbewegung.name_ag,   
     bankbewegung.verwendungzweck  
FROM debitor,   
     debitorenstamm,   
     firmenstamm,   
     kreditorenstamm,   
     zahlung 
     LEFT JOIN z_bankbewegung ON zahlung.zahlungs_id =   z_bankbewegung.zahlungs_id,
     LEFT JOIN bankbewegung ON z_bankbewegung.babe_id = bankbewegung.babe_id

 WHERE ( firmenstamm.firmen_id = kreditorenstamm.firmen_id ) and  
         ( kreditorenstamm.kreditoren_id = debitor.kreditoren_id ) and  
         ( debitor.debitoren_id = debitorenstamm.debitoren_id ) and  
         ( debitor.kreditoren_id = zahlung.kreditoren_id ) and  
         ( debitor.deb_id_vom_kreditor = zahlung.deb_id_vom_kreditor ) and  
         ( ( zahlung.zahlung_betrag_offen > 0 ) )   

My Problem now is the following: As you can see I made a multiple left join on the same table. I always get the error message "Table or view does not exist" (ORA-00942).

zahlung 
LEFT JOIN z_bankbewegung ON zahlung.zahlungs_id =   z_bankbewegung.zahlungs_id,
LEFT JOIN bankbewegung ON z_bankbewegung.babe_id = bankbewegung.babe_id

I can't see my mistake. Does anyone have any idea?


Solution

  • You are mixing the old, ancient and fragile implicit joins (listing all tables separated by a comma in the FROM clause, then put the join conditions in to the WHERE clause) and the "modern"1) explicit JOIN operator. Don't do that. Use explicit JOINs for everything:

    SELECT ...
    FROM debitor
      JOIN debitorenstamm ON debitor.debitoren_id = debitorenstamm.debitoren_id
      JOIN kreditorenstamm ON kreditorenstamm.kreditoren_id = debitor.kreditoren_id
      JOIN firmenstamm ON firmenstamm.firmen_id = kreditorenstamm.firmen_id
      JOIN zahlung
        ON debitor.kreditoren_id = zahlung.kreditoren_id
       AND debitor.deb_id_vom_kreditor = zahlung.deb_id_vom_kreditor
      LEFT JOIN z_bankbewegung ON zahlung.zahlungs_id = z_bankbewegung.zahlungs_id
      LEFT JOIN bankbewegung ON z_bankbewegung.babe_id = bankbewegung.babe_id
    WHERE zahlung.zahlung_betrag_offen > 0
    

    1) "modern" is relative: explicit JOINs have been introduced in the SQL standard in 1992 more than 25 years ago. So that's hardly "modern" in the sense of "brand new".