Subqueries
Fabian
- datenbank
nAbend Leser,
eine kleine Übung in DBen an der BA:
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')
);
Oben ist meine Abfrage zu sehen! Mein Problem ist,
dass ich das falsche Ergebnis bekomme. Ich möchte
durch die zweite Abfrage bestimmte knr filtern, nur
leider macht er dies nicht.
Es ist so - meine Ideen an Mengenoperatoren/-vergleichen
ist noch nicht allzu groß! Hat hier jemand eine Idee
wie das Problem gelöst werden kann? Es sollen lediglich die
knr ausgelesen/erfasst werden, welche nicht in der Menge
des zweiten Queries stecken.
Meine DB-Kenntnisse beschränken sich auf Oracle-Syntax, aber da wäre NOT IN der passende Operator. Vermutlich tut der es in Deinem Fall auch.
Tutorials, viel Input und auch die verschiedenen DB-Handbücher findest du übrigens im Zoo.
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