View Full Version : SQL EXISTS Abfrage ausserhalb WHERE
Hallo,
ist es möglich eine EXISTS-Abfrage ausserhalb einer WHERE-Bestimmung eines SELECTs auszuführen? Ich benötige das in diesem Fall um in einem ILERPG-Programm herauszufinden, ob ein Satz exisitiert. Praktisch eine Ablösung von SETLL + %EQUAL.
Danke
M.Withake
Das läßt sich nur mittels normalem Select erledigen:
select count(*) into :mycount
from myfile
where .....
if mycount>*zero;
:
endif;
Das mit dem SELECT COUNT(*) ist nicht wirklich eine gute Lösung. Wenn es z.B. darum geht, ob ein Kunden in einer Auftragsdatei vorhanden ist und die Auftragssätze für diesen Kunden 100.000 Sätze oder mehr betragen, wird die Abfrage sehr lange dauern...
Alternativ hatte ich schon folgendes probiert:
SELECT 1
INTO :HOSTVARIABLE
FROM DATEI
WHERE EXSIST (SELECT * FROM DATEI WHERE bedingung)
FETCH FIRST ROW ONLY
Aber das ist auch nicht so schnell wie SETLL/%EQUAL.
select feldx into :myfeld
from datei
where < bedingung >
fetch first 1 rows only
if sqlcod = *zero; // Satz vorhanden
else;
endif;
ist schon der richtige Weg.
Wenn für "Bedingung" Zugriffspfade bestehen erfolgt der Zugriff auch schnell
Ggf. kann mit "optimize for 1 rows" noch etwas beschleunigt werden.
Allerdings wird nichts so schnell wie SETLL sein, da hier ja native über eine LF zugegriffen wird. Wobei ein CHAIN mit verkürztem Schlüssel noch schneller ist.
Hallo,
Rekord Löffel Exzess ist immer das sparsamste und damit bezogen auf eine atomare Operation das schnellste (da gibt es ein paar Marketing Aussagen, die das anders darstellen: Marketing halt...).
SQL kann dann Speed machen, wenn Zugriffe grob granular sind (ja, ein komplexer Join kann schneller sein als 76 read und chain und trulala). Auch ein Select count(*) wird bei entsprechender Hardware und Index Design schneller sein als nachzählen mit Rekord Löffel Exzess.
Der Rest an Speed in der Datenbank kommt aus dem Applikations Design (cachen von häufig gelesenen Sätzen, sinnige Zugriffslogik etc.) Letzteres führt dazu, dass im richtigen Leben mit SQL richtig Dampf gemacht werden kann, wenn man ausreichend Hardware hat.
mfg
Dieter Bender
select feldx into :myfeld
from datei
where < bedingung >
fetch first 1 rows only
if sqlcod = *zero; // Satz vorhanden
else;
endif;
ist schon der richtige Weg.
Wenn für "Bedingung" Zugriffspfade bestehen erfolgt der Zugriff auch schnell
Ggf. kann mit "optimize for 1 rows" noch etwas beschleunigt werden.
Allerdings wird nichts so schnell wie SETLL sein, da hier ja native über eine LF zugegriffen wird. Wobei ein CHAIN mit verkürztem Schlüssel noch schneller ist.