Messaggio
Codice: 512
Messaggio in italiano: La sottoquery ha restituito più di un valore. Ciò non è consentito per le sottoquery che seguono i caratteri =, !=, <, <= , >, >= o utilizzate come espressione.
Messaggio in inglese: Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Spiegazione
Quando si usa una subquery in un elenco di selezione, questa deve restituire solo un campo con una riga (cioè un valore scalare).
Lo stesso vale quando si confronta un valore con il risultato di una subquery con operatori di uguaglianza.
Esempio:
SELECT (SELECT Campo1 FROM TABELLA)
questa query può restituire più di una riga nella subquery per ogni riga della query esterna.
Esempio:
SELECT * FROM tabella WHERE id = (SELECT Campo1 FROM tabella WHERE Campo2 = 'ABC')
Nel caso in cui non si abbia la certezza che la subquery restituisce una sola riga (magari perché il Campo2 dell’esempio è unico), è possibile che la subquery restituisca più di una riga, e in questo caso il confronto con il campo id sarebbe impossibile.
Causa
Si è inserita nell’elenco di campi della SELECT o a destra di un operatore di uguaglianza una subquery che restituisce più di una riga, e questo non è possibile.
Soluzione
Se è sufficiente che la subquery restituisca un solo valore, è possibile usare TOP 1.
Esempio:
SELECT (SELECT TOP 1 Campo1 FROM TABELLA)
Se la subquery restituisce lo stesso valore ripetuto molte volte, si può aggirare il problema usando DISTINCT.
Esempio:
SELECT (SELECT DISTINCT Campo1 FROM TABELLA)
Nota: a meno che la subquery non sia estremamente banale, con questa sintassi è possibile degradare molto velocemente le prestazioni della query.