ANY und ALL
Chriss021
- datenbank
Hi,
ich habe ein bisschen im Forumsarchiv gestöbert und bin auch auf einen Beitrag über all und any gekommen. Doch selbst nach der darunter stehenden Erläuterung war mir der Unterschied noch nicht klar.
Ich habe mir mit Kundendaten ein kleines Beispiel erstellt wobei ich einen Kunden zweimal in der Kartei habe. Hier mein Beispiel
use BestellungenDB;
SELECT k.name, k.id
FROM Kunden k
WHERE k.name = ANY
(SELECT kx.name
FROM Kunden kx
WHERE kx.name = k.name and k.id != kx.id )
bei ANY gibt er mir nur die beiden Kunden aus deren Name zweimal vorkommt und bei ALL alle Kunden, einschließlich den beiden doppelten.
Verwende Microsft SQL Server 2005.
Hoffe mir kann jemand weiter helfen.
Hallo
ich habe ein bisschen im Forumsarchiv gestöbert und bin auch auf einen Beitrag über all und any gekommen. Doch selbst nach der darunter stehenden Erläuterung war mir der Unterschied noch nicht klar.
ALL und ANY werden so gut wie nie benötigt. Es gibt Operatoren, die das gleiche Ergebnis viel verständlicher erreichen.
Ich habe mir mit Kundendaten ein kleines Beispiel erstellt wobei ich einen Kunden zweimal in der Kartei habe. Hier mein Beispiel
use BestellungenDB;
SELECT k.name, k.id
FROM Kunden k
WHERE k.name = ANY
(SELECT kx.name
FROM Kunden kx
WHERE kx.name = k.name and k.id != kx.id )bei ANY gibt er mir nur die beiden Kunden aus deren Name zweimal vorkommt und bei ALL alle Kunden, einschließlich den beiden doppelten.
Ja. Ist durchaus ok.
Du hast bei dieser Abfrage mit ALL einen hakeligen Spezialfall aufgemacht.
Für die nicht mehrfach vorkommenden Namen liefert die Subquery _keinen_ Wert zurück. MS SQL-Server interpretiert dieses Ergebnis so, dass die Vergleichsbedingung für _jeden_ vorkommenden Wert erfüllt ist, und gibt daher TRUE zurück. In den Fällen, wo die Subquery einen Wert zurückliefert ist dieser automatisch für alle gleich, dafür sorgt schon die WHERE-Klausel der Subquery. Daher bekommst Du alle Kunden zurück.
Grundsätzlich ist es zu empfehlen, die Query so aufzubauen, dass das gewünschte Resultat herauskommt.
Was möchtest Du mit Deiner Abfrage: Die Kunden anzeigen, deren Name mehr als einmal vorkommt? Dann verwende den zu "= ANY" äquivalenten Operator IN:
SELECT -- Gib mir
k.name, -- den Namen des Kunden
k.id -- und seine id
FROM -- aus
Kunden k -- der Tabelle Kunden, die über den Namen k angesprochen wird
WHERE -- wobei
k.name IN ( -- der Name des Kunden
SELECT -- in der Liste der
kx.name -- Namen
FROM -- der
Kunden kx -- Kunden enthalten ist
WHERE -- die
kx.name = k.name -- genauso heißen
AND -- aber
k.id != kx.id -- eine andere id haben,
) -- und somit mehrfach vorhanden sind.
finde ich viel verständlicher als die Formulierung mit = ANY.
Links zur Dokumentation von Microsoft:
ANY
ALL
Freundliche Grüße
Vinzenz