Archiv verlassen und diese Seite im Standarddesign anzeigen : Schlüsselwort "all"
Hallo zusammen,
über folgende Syntax:
SELECT...
FROM...
WHERE x = ALL (<Ergebnismenge>)
bekomme ich alle Datensätze, bei denen ALLE Elemente der Ergebnismenge mit dem Wert von x übereinstimmen (oder anders formuliert: bei denen alle Elemente der Ergebnismenge gleich dem Wert von x sind).
Was passiert aber wenn ich das verneine?
SELECT...
FROM...
WHERE x != ALL (<Ergebnismenge>)
Heißt das nun, ich bekomme alle Datensätze, bei denen
a) alle Elemente der Ergebnismenge ungleich x sind oder
b) nicht alle Elemente der Ergebnismenge gleich x sind
Zum besseren Verständnis:
Stünde da am Ende
...
WHERE 5 != ALL (5, 7)
dann würde Vorschlag a) den Datensatz nicht zurückliefern, Vorschlag b) hingegen schon.
Merci und schönen Freitagnachmittag noch,
Bubble
Christoph
03-07-2004, 20:57
Deine Frage bezieht sich vermutlich auf Subqueries, d.h. <Ergebnismenge> steht für ein SELECT Statement.Die Formulierung mit ALL ist mir neu, scheint aber bei PostgreSQL auch zu funktionieren. Ansonsten geht das auch mit IN statt "= ALL". Neben ALL gibt es anscheinend auch noch ANY.
Verneinung in SQL geht nicht mit einem Ausrufezeichen, sondern mit NOT. Der Operator "ungleich" ist "<>" und nicht "!=".
Der Operator IN hilft mir in diesem Fall aber leider nicht weiter, da ich den Datensatz nur dann zurückgeliefert haben möchte, wenn im Ausdruck
... WHERE x <> ALL (<Ergebnismenge>)
die Ergebnismenge neben x noch weitere Werte enthält. <Ergebnismenge> ist tatsächlich eine Subquery, welche Werte zurückliefert, in denen auf jeden Fall x und eventuell noch weitere Werte vorhanden sind. Ich möchte jetzt alle Datensätze herausfiltern, in denen <Ergebnismenge> neben x noch weitere Werte enthält (daher geht kein IN, da alle Datensätze zurückkämen ==> x ist in <Ergebnismenge> ja vorhanden!).
Kurz vielleicht zum Problem:
Eine Tabelle hat drei Attribute a, b und c. Ich möchte nun mit einem SELECT-Statement alle gleiche Kombinationen a und b ermitteln, die aber verschiedene Werte von c haben. Also Beispiel:
a b c
= = =
1 1 0
1 2 3
1 1 1
In diesem Fall möchte ich mit dem SELECT
a b
= =
1 1
zurückbekommen, da diese Kombination in der Tabelle mit unterschiedlichen Werten von c vorhanden ist (einmal 0, einmal 1).
Das wollte ich eben mit einem solchen Subquery lösen, aber vielleicht gibts noch ne elegantere Möglichkeit, bin mit komplexen SQL-Abfragen noch nicht so vertraut ...
Vielen Dank auf jeden Fall,
Bubble
Christoph
05-07-2004, 19:16
Interessante Fragestellung, die mit einem Self-Join lösbar sein sollte, z.B.
select t1.a,t1.b from tbl t1, tbl t2 where t1.a=t2.a and t1.b=t2.b and t1.c<>t2.c group by t1.a, t1.b
Noch eine Bemerkung zu Subqueries: wenn mann um ein Select-Statement eine Klammer macht, dann wirkt das als Tabellenkonstruktor den man anstelle jeder normalen Tabelle verwenden kann (PostgreSQL verlangt allerdings dafür einen Aliasnamen).
Ja, das SELECT-Statement scheint zu funktionieren. Ich hab es mit einem Subselect gelöst (hab aber auf das ALL verzichtet), aber deine Methode ist irgendwie eleganter und ich denke auch schneller ...
Merci :).
Bubble
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.