Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Les éléments ORDER BY doivent apparaître dans la liste de sélection si l'instruction contient un opérateur UNION, INTERSECT ou EXCEPT (SQL Server)

Si vous exécutez une requête dans SQL Server et que vous obtenez l'erreur suivante…

Msg 104, Level 16, State 1, Line 8
ORDER BY items must appear in the select list if the statement contains a UNION, INTERSECT or EXCEPT operator.

… vous devriez vérifier votre instruction SQL - vous avez probablement omis une colonne de votre SELECT liste.

Comme le message d'erreur l'indique, vous ne verrez probablement cette erreur que si vous exécutez une requête contenant un UNION , INTERSECT ou EXCEPT opérateur.

Ajoutez simplement la colonne à votre SELECT liste devrait résoudre le problème.

Exemple

Voici un exemple de génération de l'erreur.

SELECT 
    CatName
FROM Cats
UNION ALL
SELECT 
    DogName 
FROM Dogs
ORDER BY CatId;

Résultat :

Msg 104, Level 16, State 1, Line 8
ORDER BY items must appear in the select list if the statement contains a UNION, INTERSECT or EXCEPT operator.

Le problème ici, c'est que j'essaie de commander par le CatId colonne, mais je ne sélectionne pas réellement cette colonne dans mon SELECT liste.

Le moyen le plus simple de résoudre ce problème est d'ajouter cette colonne à mon SELECT liste.

SELECT 
    CatId AS PetID,
    CatName AS PetName
FROM Cats
UNION ALL
SELECT 
    DogId AS PetID,
    DogName AS PetName
FROM Dogs
ORDER BY PetId;

Résultat :

+---------+-----------+
| PetID   | PetName   |
|---------+-----------|
| 1       | Brush     |
| 1       | Yelp      |
| 2       | Scarcat   |
| 2       | Woofer    |
| 3       | Flutter   |
+---------+-----------+

En fait, dans mon cas, je sélectionne des colonnes avec des noms différents (CatId vs DogId , CatName vs DogName ), j'ai donc décidé d'utiliser un alias pour ces colonnes (PetId et PetName ). Dans ce cas, je peux ORDER BY le nom d'alias (PetId ).