Chriss021: ANY und ALL

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.

  1. 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