Qualcuno può dirmi che cosa il risultato al seguente dovrebbe essere secondo lo standard (un riferimento alla parte corretta dello standard sarebbe il benvenuto)Cosa dice lo standard SQL sui condizionali "dipendenti" in UPDATE?
> select * from t1;
+------+
| col1 |
+------+
| 9 |
| 8 |
| 10 |
+------+
> update t1
set col1 = col1 * 2
where col1 <= (select avg(col1) from t1);
il punto è: L'ultima riga si aggiorna, dal momento che se le righe vengono aggiornate in ordine e la media viene ricalcolata per ogni riga, soddisferà la condizione o non verrà aggiornata in quanto qualsiasi dato modificato da questa dichiarazione sarà leggibile solo dopo l'esecuzione dell'intera istruzione?
EDIT E che dire di questo caso?
> select * from t1;
+------+------+
| col1 | col2 |
+------+------+
| 9 | 1 |
| 8 | 2 |
| 10 | 2 |
+------+------+
> update t1 p1
set col1 = col1 * 2
where col1 <= (select avg(col1)
from t1
where col2=p1.col2);
Qui viene eseguita prima la sottoquery. Quindi la media non cambia. –
@Shiplu Grazie. E che dire di questo secondo caso, in cui la subquery non può essere pre-eseguita? – baruch
@baruch - Può essere pre-eseguito in quanto un'operazione di lettura separata identifica le righe da aggiornare e memorizza gli identificatori di riga in uno spool o simili, quindi l'aggiornamento viene eseguito leggendo da quello spool al termine della lettura. Questo è il piano che mi aspetto in SQL Server. Non sono sicuro di poter essere disturbato a scavare attraverso lo standard SQL per trovare i bit rilevanti. Un paio di concetti correlati sono "operazioni tutto in una volta" e protezione di Halloween. –