Czy ktoś może mi powiedzieć, co wynika z następujących powinny być zgodne z normą (odniesienie do odpowiedniej części normy byłoby mile widziane)Co mówi standard SQL o warunkach zależnych w AKTUALIZACJI?
> select * from t1;
+------+
| col1 |
+------+
| 9 |
| 8 |
| 10 |
+------+
> update t1
set col1 = col1 * 2
where col1 <= (select avg(col1) from t1);
Chodzi o to: Czy ostatni wiersz aktualizowane, ponieważ jeśli wiersze są aktualizowane w kolejności, a średnia jest ponownie obliczana dla każdego wiersza, to spełni warunek, czy też nie zostanie zaktualizowany, ponieważ jakiekolwiek dane zmienione przez tę instrukcję będą mogły być odczytane po uruchomieniu całej instrukcji?
EDYTOWANIE A co z tą sprawą?
> 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);
Tutaj najpierw wykonuje się podzapytanie. Więc średnia nie zmienia się. –
@Shiplu Dziękuję. A co z drugim przypadkiem, w którym podzapytanie nie może być wykonane wcześniej? – baruch
@baruch - Można go wstępnie wykonać, ponieważ oddzielna operacja odczytu identyfikuje wiersze do aktualizacji i przechowuje identyfikatory wierszy w szpulach lub podobnych, a aktualizacja jest wykonywana podczas odczytu z tej szpuli po zakończeniu odczytu. Taki jest plan, którego oczekiwałbym w SQL Server. Nie jestem pewien, czy mogę zadać sobie trud sprawdzenia standardu SQL, aby znaleźć odpowiednie bity. Kilka pokrewnych pojęć to "operacje na raz" i ochrona przed halloweenami. –