SQL标准在UPDATE中对“依赖”条件的说法是什么?

时间:2012-04-01 08:36:16

标签: sql standards

任何人都可以告诉我以下结果应该符合标准(欢迎参考标准的正确部分)

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

关键是:最后一行是否得到更新,因为如果按顺序更新行并且每行重新计算平均值,它将满足条件,或者不会更新,因为此语句更改了任何数据只有在整个语句运行后才可读?

修改 那个案子怎么样?

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

3 个答案:

答案 0 :(得分:4)

关于第一个查询,subquery首先执行,所以平均没有变化......

关于第二个查询,您在UPDATE语句中使用了别名,但是您使用了错误方法的别名。

UPDATE语句中使用别名的正确和标准方法是:

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

答案 1 :(得分:4)

据我所知,标准(第14.11节,SQL 2003 - 基金会)对此非常清楚:

  

对T 的每一行进行有效评估更新任何T行

(强调我的)

我对该句子的理解是在任何行更新之前评估任何条件(无论是否相关)。

答案 2 :(得分:2)

最后一行不会更新。 因为“从t1选择avg(col1)”是一个子查询,它将首先运行,并将结果存储在临时表中,然后执行update语句。