Andreas_: mySQL: LEFT JOIN mit ISNULL()

Hallo, ich hätte da gern mal ein Problem ;-)
Ich habe eine Tabelle mit Aufträgen und eine Tabelle mit dazugehörigen Dokumenten wie z.B. Angebote, Auftragsbestätigungen, Lieferscheine etc. die mit einer Status-Nummer gekennzeichnet sind (Lieferschein hat den Status 6):

Tabelle orders:
order_id | order_date

Tabelle documents:
document_id | order_id | document_status | document_date

Jetzt möchte ich gerne alle Aufträge haben, bei denen noch kein Lieferschein erzeugt wurde.

Ich habe es mit ISNULL() versucht:

select * from orders left join documents using(order_id)  
where ISNULL(documents.order_id)

Damit bekomme ich alle Aufträge, wozu es noch gar kein Dokument gibt.
Aber mit folgendem Statement bekomme ich gar keine Ergebnisse (obwohl es welche geben müsste):

select * from orders left join documents using(order_id)  
where document_status=6 and ISNULL(documents.order_id)

Hat jemand eine Idee?

  1. Hallo,

    Aber mit folgendem Statement bekomme ich gar keine Ergebnisse (obwohl es welche geben müsste):

    select * from orders left join documents using(order_id)

    where document_status=6 and ISNULL(documents.order_id)

      
    nein. Dieses Statement kann keinen einzigen Datensatz zurückliefern. Das ist völlig korrekt.  
      
    Deine Bedingung mit dem document\_status gehört in die Join-Bedingung, nicht in die WHERE-Klausel, siehe zum Beispiel [diesen Archivbeitrag](/archiv/2008/4/t170482/#m1114517).  
      
      
    Freundliche Grüße  
      
    Vinzenz
    
    1. Danke für die Antwort!
      Hab's aber leider noch nicht hingekriegt:

        
      select * from orders  
      left join documents  
      on orders.order_id=documents.order_id  
      and documents.document_status=6  
      where ISNULL(documents.order_id)
      

      Kannst Du mir für das Beispiel die Abfrage sagen.....?

  2. Hallo Andreas,

    Ich habe eine Tabelle mit Aufträgen und eine Tabelle mit dazugehörigen Dokumenten wie z.B. Angebote, Auftragsbestätigungen, Lieferscheine etc. die mit einer Status-Nummer gekennzeichnet sind (Lieferschein hat den Status 6):

    Tabelle orders:
    order_id | order_date

    Tabelle documents:
    document_id | order_id | document_status | document_date

    Jetzt möchte ich gerne alle Aufträge haben, bei denen noch kein Lieferschein erzeugt wurde.
    Hat jemand eine Idee?

    ich hatte es ganz vergessen. Joins sind in diesem Falle eher zweite Wahl.
    Du möchtest eher eine Subquery verwenden:

    SELECT            -- Gib mir  
       o.order_id,             -- die Aufträge  
       o.order_date  
    FROM  
        orders o  
    WHERE                      -- für die  
        NOT EXISTS (           -- kein  
            SELECT  
                d.order_id  
            FROM  
                documents d  
            WHERE  
                d.order_id = o.order_id   -- zugeordneter  
            AND  
                d.document_status = 6     -- Lieferschein  
        )                                 -- existiert  
    
    

    Freundliche Grüße

    Vinzenz

    1. Whow!
      Das sieht gut aus!
      Vielen herzlichen Dank!