sql >> Databasteknik >  >> RDS >> Sqlserver

3 sätt att använda ALLT i SQL Server

Du kanske är bekant med ALL alternativ i SQL Server. Du kanske har använt den tillsammans med UNION operatorn för att inkludera alla dubbletter som kan returneras i resultatuppsättningen.

Men visste du att ALL kan även användas i två andra sammanhang?

ALL kan användas i följande tre sammanhang:

  • Som ett argument till SELECT klausul.
  • Som ett argument till UNION klausul.
  • Som en logisk operator när man jämför ett skalärt värde med en uppsättning värden i en kolumn.

Exempel på vart och ett av dessa sammanhang följer.

ALL i SELECT Klausul

När den används med SELECT klausul, ALL anger att dubbletter av värden returneras i resultatuppsättningen.

Du använder förmodligen redan detta implicit utan att ens veta det.

I T-SQL, syntaxen för SELECT klausul går så här:

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 ]

Delen som går till [ ALL | DISTINCT ] innebär att du får ett val mellan ALL och DISTINCT .

De fyrkantiga parenteserna betyder att denna del är valfri.

  • ALL anger att dubbletter av rader kan visas i resultatuppsättningen.
  • DISTINCT anger att endast unika rader kan visas i resultatuppsättningen.

ALL är standardvärdet, så om du inte anger ALL eller DISTINCT , ALL används.

Exempel

Så följande två påståenden är likvärdiga:

SELECT DogName 
FROM Dogs;

SELECT ALL DogName 
FROM Dogs;

Exempelresultat:

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

Båda resultaten visar att det finns två hundar som heter "Fetch".

Om vi ​​byter ALL argument för DISTINCT , kommer endast en rad att returneras för "Hämta". Detta beror på att DISTINCT tar bort alla dubbletter av värden från resultatuppsättningen.

SELECT DISTINCT DogName 
FROM Dogs;

Exempelresultat:

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

ALL i UNION Klausul

ALL gör samma sak när den används med UNION klausul. Den anger att dubbletter av värden returneras i resultatuppsättningen.

Men självklart, UNION är en annan klausul än SELECT , så sammanhanget är något annorlunda.

UNION sats sammanfogar resultaten av två frågor till en enda resultatuppsättning. Du kan använda den med eller utan ALL argument:

  • UNION ALL – Inkluderar dubbletter.
  • UNION – Exkluderar dubbletter.

Exempel

Här är ett exempel på hur du använder UNION ALL för att kombinera två frågor.

Låt oss lägga till en tabell som heter Cats . Så vi har två tabeller:Dogs och Cats

Dogs

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

Cats

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

Låt oss nu välja hundens/kattnamnet från varje tabell och använda UNION ALL för att kombinera resultaten från båda tabellerna.

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

Resultat:

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

I detta fall returneras sju rader. Vi kan se att "Hämta" returneras två gånger. Detta beror på att det finns två hundar som heter Fetch.

Det finns också en katt och en hund med samma namn:Fluffy. (Vi vet att den andra är en katt eftersom det bara fanns en hund som hette Fluffy i föregående exempel).

Låt oss se vad som händer när jag tar bort ALL argument.

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

Resultat:

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

Denna gång returneras endast fem rader. Båda dubbletterna tas bort.

Observera att detta skiljer sig från att tillämpa DISTINCT till varje enskild SELECT påstående. Om vi ​​hade gjort det skulle Fluffy ha returnerats två gånger, eftersom ALL skulle endast gälla för SELECT uttalande som det appliceras mot (inte på de sammanlänkade resultaten).

Här är ett exempel för att illustrera vad jag menar.

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

Resultat:

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

ALL Operatör

ALL operatorn kan användas med en underfråga för att jämföra ett skalärt värde med en uppsättning värden i en kolumn som returneras av underfrågan.

Exempel

Som en uppfräschning, här är våra två tabeller:

Dogs

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

Cats

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

Låt oss nu köra en underfråga med ALL operatör.

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

Resultat:

(0 rows affected)

I det här fallet returnerades inga rader. Detta beror på att ALL kräver att det skalära uttrycket jämförs positivt med alla värde som returneras av underfrågan.

I det här fallet var underfrågan så bred att alla rader från Dogs bordet returnerades. Detta skulle kräva att varje hund hade minst en motsvarande katt med samma namn.

Låt oss ändra underfrågan något.

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

Resultat:

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

Den här gången får jag ett positivt resultat, eftersom alla rader som returneras av underfrågan hade en motsvarande rad i Cats tabell (i detta fall endast en rad).


  1. Hibernate, id, orakel, sekvens

  2. ändra tabell modifiera kolumn i Oracle-databasen

  3. Använder COALESCE för att hantera NULL-värden i PostgreSQL

  4. Vilken är den korrekta SQL-typen för att lagra en .Net Timespan med värden> 24:00:00?