Vous connaissez peut-être le ALL option dans SQL Server. Peut-être l'avez-vous utilisé avec le UNION opérateur pour inclure tous les doublons qui pourraient être renvoyés dans le jeu de résultats.
Mais saviez-vous que ALL peut également être utilisé dans deux autres contextes ?
ALL peut être utilisé dans les trois contextes suivants :
- Comme argument du
SELECTclause. - Comme argument de l'
UNIONclause. - Comme opérateur logique lors de la comparaison d'une valeur scalaire avec un ensemble de valeurs à une seule colonne.
Des exemples de chacun de ces contextes suivent.
ALL dans le SELECT Article
Lorsqu'il est utilisé avec le SELECT clause, ALL spécifie que les valeurs en double sont renvoyées dans le jeu de résultats.
Vous l'utilisez probablement déjà implicitement sans même le savoir.
Dans T-SQL, la syntaxe du SELECT la clause se présente comme suit :
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 ]
La partie qui va [ ALL | DISTINCT ] signifie que vous avez le choix entre ALL et DISTINCT .
Les crochets signifient que cette partie est facultative.
ALLspécifie que les lignes en double peuvent apparaître dans le jeu de résultats.DISTINCTspécifie que seules des lignes uniques peuvent apparaître dans le jeu de résultats.
ALL est la valeur par défaut, donc si vous ne spécifiez pas ALL ou DISTINCT , ALL est utilisé.
Exemple
Ainsi, les deux déclarations suivantes sont équivalentes :
SELECT DogName
FROM Dogs;
SELECT ALL DogName
FROM Dogs; Exemple de résultat :
+-----------+ | DogName | |-----------| | Fetch | | Fluffy | | Wag | | Fetch | +-----------+ (4 rows affected) +-----------+ | DogName | |-----------| | Fetch | | Fluffy | | Wag | | Fetch | +-----------+ (4 rows affected)
Les deux résultats montrent qu'il y a deux chiens nommés "Fetch".
Si nous échangeons le ALL argument pour DISTINCT , une seule ligne sera renvoyée pour "Fetch". C'est parce que DISTINCT supprime toutes les valeurs en double du jeu de résultats.
SELECT DISTINCT DogName
FROM Dogs; Exemple de résultat :
+-----------+ | DogName | |-----------| | Fetch | | Fluffy | | Wag | +-----------+ (3 rows affected)
ALL dans l'UNION Article
ALL fait la même chose lorsqu'il est utilisé avec le UNION clause. Il spécifie que les valeurs en double sont renvoyées dans le jeu de résultats.
Mais évidemment, UNION est une clause différente de SELECT , le contexte est donc légèrement différent.
L'UNION La clause concatène les résultats de deux requêtes en un seul jeu de résultats. Vous pouvez l'utiliser avec ou sans le ALL argument :
UNION ALL– Inclut les doublons.UNION– Exclut les doublons.
Exemple
Voici un exemple d'utilisation de UNION ALL pour combiner deux requêtes.
Ajoutons une table appelée Cats . Nous avons donc deux tables :Dogs et Cats
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | | 1002 | Fetch | +---------+-----------+
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Maintenant, sélectionnons le nom du chien/chat dans chaque table et utilisons UNION ALL combiner les résultats des deux tableaux.
SELECT DogName AS PetName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats; Résultat :
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Wag | | Fetch | | Meow | | Fluffy | | Scratch | +-----------+ (7 rows affected)
Dans ce cas, sept lignes sont renvoyées. Nous pouvons voir que "Fetch" est retourné deux fois. C'est parce qu'il y a deux chiens nommés Fetch.
Il y a aussi un chat et un chien du même nom :Fluffy. (Nous savons que l'autre est un chat car il n'y avait qu'un seul chien appelé Fluffy dans l'exemple précédent).
Voyons ce qui se passe lorsque je supprime le ALL arguments.
SELECT DogName AS PetName
FROM Dogs
UNION
SELECT CatName
FROM Cats; Résultat :
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Meow | | Scratch | | Wag | +-----------+ (5 rows affected)
Cette fois, seules cinq lignes sont renvoyées. Les deux doublons sont supprimés.
Notez que cela est différent de l'application de DISTINCT à chaque SELECT individuel déclaration. Si nous avions fait cela, Fluffy aurait été renvoyé deux fois, car le ALL ne s'appliquerait qu'au SELECT déclaration à laquelle il est appliqué (et non aux résultats concaténés).
Voici un exemple pour illustrer ce que je veux dire.
SELECT DISTINCT DogName AS PetName
FROM Dogs
UNION ALL
SELECT DISTINCT CatName
FROM Cats; Résultat :
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Wag | | Fluffy | | Meow | | Scratch | +-----------+ (6 rows affected)
Le ALL Opérateur
Le ALL L'opérateur peut être utilisé avec une sous-requête pour comparer une valeur scalaire avec un ensemble de valeurs à une seule colonne renvoyé par la sous-requête.
Exemple
Pour rappel, voici nos deux tableaux :
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | | 1002 | Fetch | +---------+-----------+
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Exécutons maintenant une sous-requête en utilisant ALL opérateur.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (SELECT DogName FROM Dogs); Résultat :
(0 rows affected)
Dans ce cas, aucune ligne n'a été renvoyée. C'est parce que ALL nécessite que l'expression scalaire se compare positivement à chaque valeur renvoyée par la sous-requête.
Dans ce cas, la sous-requête était si large que toutes les lignes de Dogs le tableau a été rendu. Cela nécessiterait que chaque chien ait au moins un chat correspondant avec le même nom.
Modifions légèrement la sous-requête.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (
SELECT DogName FROM Dogs
WHERE DogId = 2
); Résultat :
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
Cette fois, j'obtiens un résultat positif, car toutes les lignes renvoyées par la sous-requête avaient une ligne correspondante dans le Cats tableau (dans ce cas, une seule ligne).