Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Gli elementi ORDER BY devono apparire nell'elenco di selezione se l'istruzione contiene un operatore UNION, INTERSECT o EXCEPT (SQL Server)

Se stai eseguendo una query in SQL Server e ricevi il seguente errore...

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.

…dovresti controllare la tua istruzione SQL:probabilmente hai omesso una colonna dal tuo SELECT elenco.

Come suggerisce il messaggio di errore, probabilmente vedrai questo errore solo se stai eseguendo una query che contiene un UNION , INTERSECT o EXCEPT operatore.

Semplicemente aggiungendo la colonna al tuo SELECT list dovrebbe risolvere il problema.

Esempio

Ecco un esempio di generazione dell'errore.

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

Risultato:

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.

Il problema qui è che sto cercando di ordinare con il CatId colonna, ma in realtà non sto selezionando quella colonna nel mio SELECT elenco.

Il modo più semplice per risolvere questo problema è aggiungere quella colonna al mio SELECT elenco.

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

Risultato:

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

In realtà, nel mio caso sto selezionando colonne con nomi diversi (CatId rispetto a DogId , CatName vs DogName ), quindi ho deciso di utilizzare un alias per quelle colonne (PetId e PetName ). In questo caso, posso ORDER BY il nome alias (PetId ).