Vinzenz Mai: ANY und ALL

Beitrag lesen

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