Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

3 Möglichkeiten, ALL in SQL Server zu verwenden

Vielleicht kennen Sie den ALL Option in SQL Server. Vielleicht haben Sie es zusammen mit UNION verwendet -Operator, um alle Duplikate einzuschließen, die möglicherweise in die Ergebnismenge zurückgegeben werden.

Aber wussten Sie, dass ALL kann auch in zwei anderen Kontexten verwendet werden?

ALL kann in den folgenden drei Kontexten verwendet werden:

  • Als Argument für SELECT Klausel.
  • Als Argument für UNION Klausel.
  • Als logischer Operator beim Vergleichen eines Skalarwerts mit einem einspaltigen Satz von Werten.

Es folgen Beispiele für jeden dieser Kontexte.

ALL im SELECT Klausel

Bei Verwendung mit SELECT Klausel, ALL gibt an, dass doppelte Werte in der Ergebnismenge zurückgegeben werden.

Sie verwenden dies wahrscheinlich bereits implizit, ohne es zu wissen.

In T-SQL die Syntax für SELECT Klausel geht so:

SELECT [ ALL | DISTINCT ]  
[ TOP ( expression ) [ PERCENT ] [ WITH TIES ] ]   
<select_list>   
<select_list> ::=   
    {   
      *   
      | { table_name | view_name | table_alias }.*   
      | {  
          [ { table_name | view_name | table_alias }. ]  
               { column_name | $IDENTITY | $ROWGUID }   
          | udt_column_name [ { . | :: } { { property_name | field_name }   
            | method_name ( argument [ ,...n] ) } ]  
          | expression  
          [ [ AS ] column_alias ]   
         }  
      | column_alias = expression   
    } [ ,...n ]

Der Teil, der [ ALL | DISTINCT ] bedeutet, dass Sie die Wahl zwischen ALL haben und DISTINCT .

Die eckigen Klammern bedeuten, dass dieser Teil optional ist.

  • ALL gibt an, dass doppelte Zeilen in der Ergebnismenge erscheinen können.
  • DISTINCT gibt an, dass nur eindeutige Zeilen in der Ergebnismenge erscheinen können.

ALL ist der Standardwert, wenn Sie also ALL nicht angeben oder DISTINCT , ALL verwendet wird.

Beispiel

Die folgenden beiden Anweisungen sind also äquivalent:

SELECT DogName 
FROM Dogs;

SELECT ALL DogName 
FROM Dogs;

Beispielergebnis:

+-----------+
| DogName   |
|-----------|
| Fetch     |
| Fluffy    |
| Wag       |
| Fetch     |
+-----------+
(4 rows affected)
+-----------+
| DogName   |
|-----------|
| Fetch     |
| Fluffy    |
| Wag       |
| Fetch     |
+-----------+
(4 rows affected)

Beide Ergebnisse zeigen, dass es zwei Hunde mit dem Namen „Fetch“ gibt.

Wenn wir die ALL vertauschen Argument für DISTINCT , wird nur eine Zeile für „Fetch“ zurückgegeben. Das liegt daran, dass DISTINCT entfernt alle doppelten Werte aus der Ergebnismenge.

SELECT DISTINCT DogName 
FROM Dogs;

Beispielergebnis:

+-----------+
| DogName   |
|-----------|
| Fetch     |
| Fluffy    |
| Wag       |
+-----------+
(3 rows affected)

ALL in der UNION Klausel

ALL macht dasselbe, wenn es mit UNION verwendet wird Klausel. Es gibt an, dass doppelte Werte in der Ergebnismenge zurückgegeben werden.

Aber natürlich UNION ist eine andere Klausel als SELECT , daher ist der Kontext etwas anders.

Die UNION -Klausel verkettet die Ergebnisse zweier Abfragen zu einer einzigen Ergebnismenge. Sie können es mit oder ohne ALL verwenden Argument:

  • UNION ALL – Enthält Duplikate.
  • UNION – Schließt Duplikate aus.

Beispiel

Hier ist ein Beispiel für die Verwendung von UNION ALL um zwei Abfragen zu kombinieren.

Lassen Sie uns eine Tabelle namens Cats hinzufügen . Wir haben also zwei Tabellen:Dogs und Cats

Dogs

+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 1       | Fetch     |
| 2       | Fluffy    |
| 3       | Wag       |
| 1002    | Fetch     |
+---------+-----------+

Cats

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 1       | Meow      |
| 2       | Fluffy    |
| 3       | Scratch   |
+---------+-----------+

Lassen Sie uns nun den Hunde-/Katzennamen aus jeder Tabelle auswählen und UNION ALL verwenden um die Ergebnisse aus beiden Tabellen zu kombinieren.

SELECT DogName AS PetName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats;

Ergebnis:

+-----------+
| PetName   |
|-----------|
| Fetch     |
| Fluffy    |
| Wag       |
| Fetch     |
| Meow      |
| Fluffy    |
| Scratch   |
+-----------+
(7 rows affected)

In diesem Fall werden sieben Zeilen zurückgegeben. Wir können sehen, dass „Fetch“ zweimal zurückgegeben wird. Das liegt daran, dass es zwei Hunde namens Fetch gibt.

Es gibt auch eine Katze und einen Hund mit demselben Namen:Fluffy. (Wir wissen, dass der andere eine Katze ist, weil es im vorherigen Beispiel nur einen Hund namens Fluffy gab).

Mal sehen, was passiert, wenn ich ALL entferne Argument.

SELECT DogName AS PetName
FROM Dogs
UNION
SELECT CatName
FROM Cats;

Ergebnis:

+-----------+
| PetName   |
|-----------|
| Fetch     |
| Fluffy    |
| Meow      |
| Scratch   |
| Wag       |
+-----------+
(5 rows affected)

Diesmal werden nur fünf Zeilen zurückgegeben. Beide Duplikate werden entfernt.

Beachten Sie, dass sich dies von der Anwendung von DISTINCT unterscheidet zu jedem einzelnen SELECT Erklärung. Wenn wir das getan hätten, wäre Fluffy zweimal zurückgegeben worden, weil die ALL würde nur für SELECT gelten Aussage, gegen die es angewendet wird (nicht auf die verketteten Ergebnisse).

Hier ist ein Beispiel, um zu veranschaulichen, was ich meine.

SELECT DISTINCT DogName AS PetName
FROM Dogs
UNION ALL
SELECT DISTINCT CatName
FROM Cats;

Ergebnis:

+-----------+
| PetName   |
|-----------|
| Fetch     |
| Fluffy    |
| Wag       |
| Fluffy    |
| Meow      |
| Scratch   |
+-----------+
(6 rows affected)

Die ALL Betreiber

Die ALL -Operator kann mit einer Unterabfrage verwendet werden, um einen Skalarwert mit einem einspaltigen Wertesatz zu vergleichen, der von der Unterabfrage zurückgegeben wird.

Beispiel

Zur Auffrischung hier unsere beiden Tabellen:

Dogs

+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 1       | Fetch     |
| 2       | Fluffy    |
| 3       | Wag       |
| 1002    | Fetch     |
+---------+-----------+

Cats

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 1       | Meow      |
| 2       | Fluffy    |
| 3       | Scratch   |
+---------+-----------+

Lassen Sie uns nun eine Unterabfrage mit ALL ausführen Betreiber.

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName = ALL (SELECT DogName FROM Dogs);

Ergebnis:

(0 rows affected)

In diesem Fall wurden keine Zeilen zurückgegeben. Das liegt daran, dass ALL erfordert, dass der skalare Ausdruck positiv mit every verglichen werden kann Wert, der von der Unterabfrage zurückgegeben wird.

In diesem Fall war die Unterabfrage so breit angelegt, dass alle Zeilen aus Dogs Tisch wurde zurückgegeben. Dies würde erfordern, dass jeder Hund mindestens eine entsprechende Katze mit demselben Namen hat.

Lassen Sie uns die Unterabfrage etwas ändern.

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName = ALL (
    SELECT DogName FROM Dogs 
    WHERE DogId = 2
    );

Ergebnis:

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 2       | Fluffy    |
+---------+-----------+

Dieses Mal erhalte ich ein positives Ergebnis, da alle von der Unterabfrage zurückgegebenen Zeilen eine entsprechende Zeile in den Cats hatten Tabelle (in diesem Fall nur eine Zeile).