PDA

View Full Version : SQL EXISTS Abfrage ausserhalb WHERE



mwithake
03-11-05, 12:42
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

Fuerchau
03-11-05, 13:02
Das läßt sich nur mittels normalem Select erledigen:

select count(*) into :mycount
from myfile
where .....

if mycount>*zero;
:
endif;

mwithake
03-11-05, 13:20
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.

Fuerchau
03-11-05, 13:52
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.

BenderD
05-11-05, 09:15
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.