PDA

View Full Version : sql datenexistenz



ILEMax
07-10-10, 14:46
Hi,
ich hab hier einen Ablauf, der nur staten darf, wenn es eine best. Datenkonstelation gibt.

Nun kann ich natürlich Datei 1 lesen, dann 2, dann 3 ... und am Ende verarbeiten, wenn alles vorhanden war.

Aber ich dachte mir, sei mal modern, nimm mal sql (im ILE)

also
set zahl = (select count(*) from ...
inner join ... inner join ...
where ...
OPTIMIZE for 1 Rows

(ich will ja nur wissen ob es mind 1 Satz gibt)

Das geht aber nicht.

Ebenso beim
select dateifeld into :var from ...
inner join ... inner join ...
where ...
OPTIMIZE for 1 Rows

mit max(Feldname) oder min() zu arbeiten währe ne Alternative.

Gibt's noch eine Möglichkeit 'schnell'
zu dem Ergebniss zu kommen?

Oder doch die 'unmoderne' alte Variante.
Danke
Euer ILEMax

Fuerchau
07-10-10, 15:23
select
(select count(*) from datei1 where ...)
,
(select count(*) from datei2 where ...)
:
into : Count1, : Count2 ...

from qibm.sysdummy1

B.Hauser
07-10-10, 15:23
Die schnellste Variante mit SQL ist:



/Free
clear MyVar;
Exec SQL Select 1 into :MyVar
From SysIbm/SysDummy1
where exists (Select 1
from ... inner join ...
... inner join ...
... inner join ...);


Etwas langsamger ist:

/Free
Clear MyVar;
Exec SQL Select 1 into :MyVar
from ... inner join ...
... inner join ...
... inner join ...
Fetch first row only;

Alles andere kannst Du vergessen.
Beide Methoden müssen aber immer noch langsamer sein als mehrere Chains oder SetLLs nacheinander auszuführen.

Ich vermute, Du hast Optimize for X Rows mit Fetch X Rows only verwechselt.

Optimize for X Rows ist das Optimierungsziel. Ist x eine kleine Zahl wird so optimiert, dass der 1. Block an Daten möglichst schnell zurückkommt. Bei einer sehr großen Zahl wird so optimiert, dass das Gesamt-Ergebnis möglichst schnell ermittelt wird. Ausschlag hat diese Angabe eigentlich nur, wenn der Optimizer überlegt ob Index-Access oder Table Scan.

Bei Select ... Into und Set mit Select-Statement muss sichergestellt werden, dass entweder genau 1 oder kein Datensatz zurückgegeben wird. Werden mehrere Datensätze zurückgegeben, wird ein negativer SQL code ausgegeben werden.

Birgitta

ILEMax
07-10-10, 15:41
Danke Birgitta


/Free
clear MyVar;
Exec SQL Select 1 into :MyVar
From SysIbm/SysDummy1
where exists (Select 1
from ... inner join ...
... inner join ...
... inner join ...);

ok, versuch ich, danke

hört er in dieser Variante denn auf zu suchen, wenn der erste 'exists' gefunden wurde ?

ILEMax

B.Hauser
07-10-10, 15:57
hört er in dieser Variante denn auf zu suchen, wenn der erste 'exists' gefunden wurde ?

Yep ...

... allerdings steht und fällt das Ganze mit den richtigen/optimalen Zugriffs-Pfanden (Indices).
Deshalb gilt bei SQL immer analysieren, bevor das Ganze in Echt geht.

Birgitta