PDA

View Full Version : Not Exist



tarkusch
20-08-12, 18:33
Hallo,

Kann mir bitte jemand erklären, warum er mir das Sql nicht akzeptiert?

Habe mir ein Tempfile aufgebaut und will eigentlich wissen welche Sätze eigentlich ausgeschlossen worden sind.


SELECT A1FIR, A1ABT A1FILE WHERE NOT EXIST
(SELECT FIR, ABT FROM
TEMP$FILE, A1FILE WHERE A1FIR= FIR AND A1ABT = ABT)


Dank im Voraus

Gruß Tarki

andreaspr@aon.at
20-08-12, 19:17
Hallo Tarki,

bitte eine etwas genauere Fehlermeldung vom System.
Ich tippe darauf, dass du lieber Alias-Namen für die Tabellen verwenden solltest, da das System nicht weis ob du bei der Spalte A1FIR von der Tabelle aus dem Haupt-Select oder dem Sub-Select verwenden willst.
Außerdem fehlt dir der FROM-Teil im Haupselect!


SELECT t1.A1FIR, t1.A1ABT FROM A1FILE T1 WHERE NOT EXIST
(SELECT FIR, ABT FROM
TEMP$FILE, A1FILE T2 WHERE t2.A1FIR= FIR AND t2.A1ABT = ABT)

meini
20-08-12, 19:38
als Ergänzung zum Beitrag über mir:
du hast das 'S' am EXISTS vergessen

mfg
Klaus

tarkusch
20-08-12, 20:14
Hallo Andreas,

Sql-Statement wird nun nicht mehr angemeckert, aber ich bekomme keine Sätze zurück obwohl jede Menge da vorhanden sein müssten.

Im subselect wähle ich die alle gleichen Sätze aus und mit der Anweisung not Exists müsste ich eigentlich die ausgeschlossenen sehen oder?

Gruß

Fuerchau
20-08-12, 20:21
Du hast keine Referenz zur Haupttabelle gegeben:

select ...
from myfile a
where not exists (select * from fileb b where a.key=b.key)

Die Feldliste im Subselect wird dabei ignoriert.

tarkusch
20-08-12, 20:29
Danke Herr Fuerchau,

kann nun dank Ihnen früher schlafen gehen ;)

thanks to *all

B.Hauser
21-08-12, 06:41
Warum überhaupt einen NOT EXISTS verwenden?
Ich denke ein Exception Join ist an dieser Stelle besser.

Soweit ich weiß kann der Optimizer direkte Joins besser optimieren, bzw. ist sogar in der Lage die Abfragen zu drehen. Bei der Verwendung von Sub-Selects in den Where-Bedingugen werden immer zuerst die From-Angaben verarbeitet und dann die Where-Bedingungen.
(... wobei vom Entwickler-Team in Rochester in den letzten Releasen einiges an Erweiterungen in den Optimizer eingebaut wurde
... was genau erfährt man allenfalls, wenn man mal einen Mike Cain in Bierlaune erwischt und das ist ziemlich selten)


select ...
from myfile a Exception Join file b
on a.Key = b.Key


Birgitta

Fuerchau
21-08-12, 09:21
Bezüglich Performance konnte ich da bisher keinen Unterschied feststellen.

tarkusch
21-08-12, 09:32
Hallo Birgitta,
wo werden weitere where clauseln hinzugefügt?

Fuerchau
21-08-12, 10:01
Die On-Klausel kann fast wie eine Where-Klausel gesehen werden:

on a.Key = b.Key and a.key2=b.key2 and b.key3='XX' ...

Ausdrücke und casts sind da auch erlaubt.

Der wesentliche Unterschied zwischen Join und exists ist, dass der Join ggf. mehrere Ergebnisse liefert und somit die Ergebnisse der Haupttabelle mehrfach vorkommen können.
Im Exists wird nur 1 Zugriff durchgeführt (nach Möglichkeit natürlich über einen Index, sonst dauerts).