2014-04-07 11 views
9

Sto tentando di aggiornare alcuni campi in base alla loro presenza. Se si verificano solo una volta, sto aggiornando alcuni campi di stato.Subquery SQL Server ha restituito più di 1 valore. Ciò non è consentito quando la subquery segue (caratteri) o quando la subquery viene utilizzata come espressione

Il mio codice attuale è la seguente:

UPDATE table1 
SET statusField = 1 
WHERE someID = (
       SELECT someID 
       FROM table1 
       GROUP BY someID HAVING COUNT(*) = 1 
       ) 

Questo restituisce un errore come quello nel titolo: Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

C'è qualche altro, come facilmente leggibile/semplice, soluzione a questo?

risposta

17

Usa IN parola chiave invece di uguale operatore in questo modo:

UPDATE table1 
SET statusField = 1 
WHERE someID IN (
      SELECT someID 
      FROM table1 
      GROUP BY someID HAVING COUNT(*) = 1 
      ) 

Utilizzando = richiede che esattamente 1 risultato viene restituito dalla subquery. La parola chiave IN funziona su una lista.

+1

Grazie così molto per averlo indicato! Ha funzionato perfettamente questa volta. – NicT

+0

'GRUPPO BY someID HAVING COUNT (*) = 1' non è richiesto qui. –

+0

Fantastico. Grazie! – Rob

1

Prova questa

Usa Top

UPDATE table1 
SET statusField = 1 
WHERE someID = (
       SELECT TOP 1 someID 
       FROM table1 
       GROUP BY someID HAVING COUNT(*) = 1 
       ) 

oppure è possibile utilizzare IN clausola

UPDATE table1 
SET statusField = 1 
WHERE someID IN (
       SELECT someID 
       FROM table1 
       GROUP BY someID HAVING COUNT(*) = 1 
       ) 
+1

il tuo primo suggerimento non restituirà una risposta utile –

3

Si dovrebbe unire le tabelle nella selezione secondaria. E 'possibile utilizzare 'in', ma nel tuo caso vorrei usare esiste:

UPDATE table1 x 
SET statusField = 1 
WHERE exists (
       SELECT null 
       FROM table1 
       WHERE x.someID = someID 
       GROUP BY someID 
       HAVING COUNT(*) = 1 
       ) 

Per ottenere prestazioni vorrei utilizzare questo script, invece (sqlserver-2008 +):

;WITH x as 
(
SELECT rc = count() over (partition by someID), statusField 
FROM table1 
) 
UPDATE x 
SET statusField = 1 
WHERE rc = 1 
+1

Grazie! Ho finito con l'utilizzo dell'operatore IN poiché la query doveva essere eseguita solo per meno di 50 righe, quindi non una query troppo grande. Tuttavia, aggiungerò questo al mio rastrello! Grazie ancora! :) – NicT