PDA

View Full Version : subselect ohne Ergebnis



Armin
16-10-07, 11:49
Hallo alle,

es gibt Problem mit einem Subselect.

Aufgabenstellung ist folgende:
Tabelle-1: Auftragspositionen mit den Feldern Auftragsmenge und bereits gelieferte Menge.

Tabelle-2: für die Auftragsposition gefertigte Teile.

Frage ist was noch zu produzieren ist.
Auftragsmenge - Liefermenge - Fertigung
In Tabelle-2 können Sätze von Null bis n vorhanden sein.

Ist nun kein Satz vorhanden bringt der Subselect einen Fehler und damit Abbruch. Rechnen sollte er aber
Auftragsmenge - Liefermenge - NULL

ExecSQL
declare AUFGEScursor cursorfor
select BDESS, BFB,
sum( BBEAB - BFAME
-(selectsum(casewhen STSTAT=1 then STAGME else STNEME end)
from FESTCKS1
where STBELE=AUFGES.BBELE and STPOSI=AUFGES.BPOSI
and STSTAT < 5))
from AUFGES
where BTEIL <> 'E'and (BSCHK, BKETG) in
(select KT3SHK, KT3REZ from KETTGA3 where KT3GAC=:Garnstring)
or BTEIL <> 'E'and (BDESS, BFB) in
(select SGDESS, SGFB from MASCHUS1 where SGGARN=:Garnnummer)
groupby BDESS, BFB
orderby BDESS, BFB ;

ExecSQL
open AUFGEScursor ;

Resteinplanung = *Zero ;
Dou sqlAUFGES <> *Zero ;

ExecSQL
fetchnextfrom AUFGEScursor into :BDESS, :BFB, :BBEAB ;

Die Whereklausel behandelt die Suche nach einer bestimmten Materialkomponente.

Danke für eure Hilfe.

Fuerchau
16-10-07, 12:13
Mit NULL läßt sich nicht rechnen.
Wird NULL in einer Berechnung verwendet, ist das Ergebnis auch immer NULL.

Wenn du ohne Satzanzeiger für NULL-Werte arbeitest, kannst du das nicht auswerten.

Ansonten mußt du folgendes verwenden:

coalesce((subselect ...), 0)

Coalesce liefert den ersten Wert, der nicht NULL ist.

Armin
16-10-07, 13:21
Das war´s.
Und sooooo einfach.:p

Die ganze Literatur ersetzt nicht die Möglichkeit eine Frage zu stellen.

Eine hab ich noch!
Soll generell DISTINCT bei subselects für die IN-Klausel verwendet werden?

BenderD
16-10-07, 13:27
Hallo,

frei nach Theorie ist das Banane, weil SQL nach dem Kohl Prinzip arbeitet, aber ein Index für den Subselect sollte ohnehin da sein und dann kanns eher nutzen als schaden.

mfg

Dieter Bender


Das war´s.
Und sooooo einfach.:p

Die ganze Literatur ersetzt nicht die Möglichkeit eine Frage zu stellen.

Eine hab ich noch!
Soll generell DISTINCT bei subselects für die IN-Klausel verwendet werden?

Fuerchau
16-10-07, 15:11
DISTINCT zwingt immer dazu ALLE Sätze zu verarbeiten und dann doppelte rauszuschmeissen.
Ohne DISTINCT entfällt das entfernen.
Aber wer weiß, vielleicht merkt der Optimzer das sogar, weil für die IN-Prüfung ist das Zwischenergebnis egal.

Was hier ggf. beschleunigen kann ist eher EXISTS, da hier bereits 1 Vorkommen ausreicht und nicht alle Sätze benötigt werden.

Aber insofern hat Dieter (wie immer) Recht, dass Zugriffspfade wesentlich bedeutender sind.

Insbesonders bei mandantenfähiger Software wird der Mandant gerne vergessen, da man ja nur einen hat ;)

BenderD
16-10-07, 15:40
Hallo,

manchmal lässt sich der exists oder where in durch einen join ersetzen und dann bleibt dem Optimizer fast kein Spielraum mehr Quatsch zu machen (selbst bei der ach so fantastischen neuen Query engine)

mfg

Dieter Bender


DISTINCT zwingt immer dazu ALLE Sätze zu verarbeiten und dann doppelte rauszuschmeissen.
Ohne DISTINCT entfällt das entfernen.
Aber wer weiß, vielleicht merkt der Optimzer das sogar, weil für die IN-Prüfung ist das Zwischenergebnis egal.

Was hier ggf. beschleunigen kann ist eher EXISTS, da hier bereits 1 Vorkommen ausreicht und nicht alle Sätze benötigt werden.

Aber insofern hat Dieter (wie immer) Recht, dass Zugriffspfade wesentlich bedeutender sind.

Insbesonders bei mandantenfähiger Software wird der Mandant gerne vergessen, da man ja nur einen hat ;)