PDA

View Full Version : SQL left join und where clause



camouflage
08-04-20, 09:07
Hi Forum,

ich brauch ein bisschen Hilfe in einer SQL-Frage.

Folgende Problemstellung:
Ich habe eine Reihe Identaufträge gehalten von einer Sammelnummer.
Dazu habe ich über eine Verknüpfung abhängige Unteraufträge.

Ueber den left join schaffe ich es (analog DDS und JDFTVAL) den Identauftrag ohne Unterauftrag anzuzeigen. Soweit so gut. Das Problem fängt dann an, wenn es einen Unterauftrag gibt, dieser aber ein Löschkennzeichen hat. Ueber die where Klausel kann ich den Unterauftrag so nicht ausschliessen, weil dann auch der Identauftrag rausfliegt.

Was ich haben möchte, ist, dass ein gelöschter Unterauftrag gleich wie ein nicht Existierender behandelt wird.

Ich hoffe, ich habe mich klar genug ausgedrückt.

Anbei meine SQL-Statements:
select i.iauftrag, l.uauftrag from identorder as i
left outer join linkorder as l
on i.iauftrag = l.uauftrag
where i.sammelnummer = 1 and i.istatus = 'ok' and l.ustatus = 'ok'
order by i.iauftrag, l.uauftrag;

Robi
08-04-20, 09:20
Moin,
nein, ich habe es nicht verstanden:confused:

Aber

Was ich haben möchte, ist, dass ein gelöschter Unterauftrag gleich wie ein nicht Existierender behandelt wird.


Warum nicht

where irgendein_feld_aus_unterauftragsdatei is null (--> nicht existent)
or löschkennzeichen_in_unterauftrag ='gelöscht'

camouflage
08-04-20, 09:32
Merci Robi,

hat geklappt.

Fuerchau
08-04-20, 11:15
Du kannst diese Bedingungen auch in der ON-Klausel verwenden. Dies ist ebenso eine Where-Klausel und somit kann ich mir die NULL-Abfrage im Gesamt-Where sparen.

left join Tab2 on Key = Key and Status <> 'D'

camouflage
08-04-20, 12:09
Hallo Baldur,
Grundsätzlich einverstanden, nur brauch ich die Nullabfrage, wenn gar kein Verknüpfungs-Satz vorhanden ist. (Uebringens inkl. der Fehlerbehandlung des SQL0305 mit dem Nullindikator). Ist halt schon noch ein Unterschied, wenn man die SQL-Abfrage im ACS oder im RPG ausführt. ;-)

Fuerchau
08-04-20, 12:33
Die NULL-Abfrage benötigt man nur, wenn man in der Where-Klausel auf Felder des Joins prüft, da sonst automatisch ein Inner-Join draus wird.
Deine Bedingung war ja, Leftjoin-Sätze auszuschließen wenn eine bestimmte Bedingung vorliegt und das kann man in der ON-Klausel ohne NULL-Abfrage machen.

Andere Programmiersprachen kennen i.d.R. keine NULL-Flag sondern die Variable ist meist vom Typ NULLABLE. So kann man "if (Var = NULL)" prüfen.
ILERPG kennt NULL nur bei Pointern.