yo,
SELECT bst.vknr, bst.knr
FROM bestellung bst JOIN verkaeufer vk ON vk.vknr = bst.vknr
WHERE bst.datum >= TO_DATE('01.10.2003', 'DD-MM-YYYY') AND
bst.knr != ANY (
SELECT knr
FROM bestellung
WHERE datum < TO_DATE('01.10.2003', 'DD-MM-YYYY')
);
deine lösung klappt deswegen nicht, weil mit ANY die prüfung gegen irgendein element der subquery erfüllt sein muss und nicht gegen alle. das wäre dann der operator ALL.
es geht aber auch einfacher, indem du die bedingung des datums mit in die obere query rein nimmst. das sollte meiner meinung nach auch zu dem ergebnis führen.
SELECT bst.vknr, bst.knr
FROM bestellung bst JOIN verkaeufer vk ON vk.vknr = bst.vknr
WHERE bst.datum >= TO_DATE('01.10.2003', 'DD-MM-YYYY')
AND bst.datum >= TO_DATE('01.10.2003', 'DD-MM-YYYY')
und dann komme ich zu einem komischen ergebnis, deine abfrage ist "doppelt gemoppelt", soll heißen, beide bedingungen in der abfrage erfüllen das gleiche nur anders geschrieben oder habe ich da jetzt einen film vor den augen ? beides sucht datensätze ab dem 1.10.2003 raus, welche davon willst du nun filtern ?
mir ist auch nicht klar, warum du die funktion TO_DATE benutzt (hört sich schwer nach oracle an), anstelle gleich das datumsfomrat einzugeben. oracle ruft dann zwar auch intern to_date auf, aber warum sich das leben schwer machen ?
eine andere lösung wäre der Mengenoperator MINUS.
abfrage1
MINUS
abfrage2
Ilja