mySQL: LEFT JOIN mit ISNULL()
    
Andreas_
    
    
      
    
  - datenbank
 
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?
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
  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.....?
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
Whow!
Das sieht gut aus!
Vielen herzlichen Dank!