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!