In questa pagina
Messaggio
Codice: 104
Descrizione in italiano: Se l’istruzione ORDER BY include l’operatore UNION, INTERSECT o EXCEPT, gli elementi dell’istruzione devono essere specificati nell’elenco di selezione.
Descrizione in inglese: ORDER BY items must appear in the select list if the statement contains a UNION, INTERSECT or EXCEPT operator.
Spiegazione
Mentre in una query senza UNION, INTERSECT o EXCEPT è possibile fare un ORDER BY per un campo che non è presente nella lista del SELECT, quando si fanno operazioni su insiemi di dati il campo con cui si sta ordinando deve essere presente nel SELECT.
Causa
Uno dei campi con cui si sta ordinando un recordset non è presente nei campi dell’istruzione SELECT.
Esempio:
SELECT Nome, Cognome FROM Anagrafica ORDER BY CodiceFiscale
Il codice qui sopra funziona perché il piano di esecuzione fa prima l’ordinamento e poi la selezione dei campi.
SELECT Nome, Cognome FROM Anagrafica UNION SELECT Nome, Cognome FROM Utenti ORDER BY CodiceFiscale
Il piano di questa query dovrebbe essere di ordinare per codice fiscale il recordset Anagrafica e il recordset Utenti e poi unisce i due recordset:
- SELECT Nome, Cognome FROM Anagrafica
- SELECT Nome, Cognome FROM Utenti
- UNION di 1. e 2.
- ORDER BY
Ma a questo punto ORDER BY non ha a disposizione il campo CodiceFiscale!
Questa query quindi restituirebbe un errore 104.
Soluzione
Soluzione 1: non ordinare per il campo che non è presente nella SELECT
Esempio:
SELECT Nome, Cognome FROM Anagrafica UNION SELECT Nome, Cognome FROM UtentiORDER BY CodiceFiscale
Soluzione 2: esporre il campo da ordinare da tutti gli insiemi
Esempio:
SELECT Nome, Cognome, CodiceFiscale FROM Anagrafica UNION SELECT Nome, Cognome, CodiceFiscale FROM Utenti ORDER BY CodiceFiscale
Soluzione 3: creare una sub-query con il campo e poi non esporlo
Esempio:
SELECT Nome, Cognome FROM ( SELECT Nome, Cognome, CodiceFiscale FROM Anagrafica UNION SELECT Nome, Cognome, CodiceFiscale FROM Utenti ORDER BY CodiceFiscale ) a