Was sagt der SQL-Standard über "abhängige" Bedingungen in UPDATE?

Kann mir jemand sagen, wie das Ergebnis dem Standard entsprechen soll (ein Verweis auf den richtigen Teil des Standards wäre willkommen)

> select * from t1; +------+ | col1 | +------+ | 9 | | 8 | | 10 | +------+ > update t1 set col1 = col1 * 2 where col1 <= (select avg(col1) from t1); 

Der Punkt ist: Wird die letzte Zeile aktualisiert, da, wenn die Zeilen in der Reihenfolge aktualisiert werden und der Durchschnitt für jede Zeile neu berechnet wird, wird die Bedingung erfüllt, oder wird sie nicht aktualisiert, da alle von dieser statement geänderten data nur sein werden lesbar, nachdem die ganze Aussage ausgeführt wurde?

EDIT Und was ist mit diesem Fall?

 > 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); 

Solutions Collecting From Web of "Was sagt der SQL-Standard über "abhängige" Bedingungen in UPDATE?"

Soweit ich das beurteilen kann, ist der Standard (Kapitel 14.11, SQL 2003 – Foundation) ziemlich klar:

Der Wert wird effektiv für jede Zeile von T ausgewertet, bevor irgendeine Zeile von T aktualisiert wird

(Hervorhebung von mir)

Mein Verständnis dieses Satzes ist, dass jede Bedingung (egal ob zusammenhängend oder nicht) ausgewertet wird, bevor irgendeine Zeile aktualisiert wird.

Über die erste Abfrage wird die subquery zuerst ausgeführt, also gibt es keine Änderungen im Durchschnitt …

Bei der zweiten Abfrage verwenden Sie den Alias ​​in der UPDATE statement, aber Sie verwenden den Alias ​​in falscher Methode.

Der korrekte und standardmäßige path zur Verwendung des Alias ​​in der UPDATE statement ist:

 UPDATE p1 set col1 = col1 * 2 from t1 p1 where col1 <= (select avg(col1) from t1 where col2=p1.col2); 

Die letzte Zeile wird nicht aktualisiert. Da "Select avg (col1) from t1" eine Unterabfrage ist und zuerst ausgeführt wird und das Ergebnis in der temporären Tabelle gespeichert wird, wird die update-statement ausgeführt.