PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Schlüsselwort "all"



Bubble
02-07-2004, 14:22
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 "!=".

Bubble
05-07-2004, 10:34
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).

Bubble
06-07-2004, 14:03
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