Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - SQL-Benutzerhandbuch » Daten abfragen und ändern » Unterabfragen verwenden » Unterabfragen testen

 

Unterabfragen und der ANY-Test

Der ANY-Test, der zusammen mit einem der SQL-Vergleichsoperatoren (=, >, <, >=, <=, !=, <>, !>, !<) verwendet wird, vergleicht einen einzelnen Wert mit der von der Unterabfrage erzeugten Spalte von Datenwerten. Um den Test durchzuführen, benutzt SQL den angegebenen Vergleichsoperator, um den Testwert mit jedem Datenwert in der Spalte zu vergleichen. Wenn irgendeiner (any) der Vergleiche das Ergebnis TRUE ausgibt, wird vom ANY-Test der Wert TRUE übergeben.

Eine Unterabfrage, die mit ANY benutzt wird, muss eine einzelne Spalte zurückgeben.

Beispiel

Es sollen Bestellnummern und Kundennummern derjenigen Bestellungen gesucht werden, die aufgegeben wurden, nachdem das erste Produkt der Bestellung 2005 ausgeliefert wurde.

SELECT ID, CustomerID
FROM SalesOrders
WHERE OrderDate > ANY (
   SELECT ShipDate
   FROM SalesOrderItems
   WHERE ID=2005 );
ID CustomerID
2006 105
2007 106
2008 107
2009 108
... ...

Beim Ausführen dieser Abfrage prüft die Hauptabfrage die Bestelldaten für jede Bestellung anhand der Versanddaten aller Produkte der Bestellung 2005. Wenn ein Bestelldatum nach dem Versanddatum für eine Lieferung der Bestellung 2005 liegt, werden die ID und Kunden-ID aus der Tabelle "SalesOrders" in die Ergebnismenge übernommen. Der ANY-Test gestaltet sich analog zum OR-Operator. Die oben genannte Abfrage kann wie folgt gelesen werden: "Wurde diese Bestellung aufgegeben, nachdem das erste Produkt der Bestellung 2005 versandt wurde, oder nachdem das zweite Produkt der Bestellung 2005 versandt wurde, oder..."

Funktion des ANY-Operators

Der ANY-Operator kann Verwirrung stiften. Man könnte versucht sein, die Abfrage wie folgt zu lesen: "Gib alle Bestellungen zurück, die aufgegeben wurden, nachdem ein beliebiges Produkt der Bestellung 2005 versandt wurde". Das bedeutet aber, dass die Abfrage die Nummern der Bestellungen und der Kunden für die Bestellungen ausgibt, die aufgegeben wurden, nachdem alle Produkte der Bestellung 2005 versandt wurden - dies wird allerdings von der Abfrage nicht erfüllt.

Sie sollten daher die Abfrage wie folgt lesen: "Gib die Nummern der Bestellungen und der Kunden für jene Bestellungen zurück, die aufgegeben wurden, nachdem mindestens ein Produkt der Bestellung 2005 versandt wurde". Wenn Sie das Schlüsselwort SOME (EINIGE) verwenden würden, könnte die Abfrage etwas einfacher verstanden werden. Die nachstehende Abfrage ist der vorherigen Abfrage gleichwertig.

SELECT ID, CustomerID
FROM SalesOrders
WHERE OrderDate > SOME (
   SELECT ShipDate
   FROM SalesOrderItems
   WHERE ID=2005 );

Das Schlüsselwort SOME hat denselben Wert wie das Schlüsselwort ANY.

Hinweise zum ANY-Operator

Es gibt zwei weitere wichtige Eigenheiten des ANY-Tests:

  • Leere Unterabfragen-Ergebnismenge   Wenn die Unterabfrage eine leere Ergebnismenge produziert, wird der ANY-Test als FALSE ausgewertet. Dies ist sinnvoll: Wenn es keine Ergebnisse gibt, dann ist es auch nicht wahr, dass mindestens ein Ergebnis den Vergleichstest bestanden hat.

  • NULL in der Ergebnismenge der Unterabfrage   Angenommen es gibt mindestens einen NULL-Wert in der Ergebnismenge der Unterabfrage. Wenn der Vergleichstest für alle Nicht-NULL-Werte in der Ergebnismenge FALSE ergibt, gibt die ANY-Suche UNKNOWN zurück. Dies ist deshalb so, weil Sie in dieser Situation nicht eindeutig folgern können, ob es einen Wert für die Unterabfrage gibt, für die der Vergleichstest ausgeführt wird. Es könnte einen Wert geben, oder aber auch nicht, abhängig von den korrekten Werten für die NULL-Daten in der Ergebnismenge. Weitere Hinweise zur ANY-Suchbedingung finden Sie unter ANY- und SOME-Suchbedingungen.