在Select列表中创建的别名不能在Select子句之前执行的子句中使用。实际上,表达式别名甚至不能用于Select列表的其他表达式。该限制是由于SQL的另一个独有的特性,即同时操作(all-at-once operation)。例如,在下面这个Select列表中,计算表达式的逻辑顺序无关紧要,而且具有不确定性:
Select c1+1 As e1,c2+1 As e2.
因此,不支持下面这个表达式:
Select c1+1 As e1,e1+1 As e2.
你只能在Select列表后面的步骤(如Order By步骤)中使用列的别名。
理解:同时操作(all-at-once operation)
我们在大多数编程环境下,交换两个变量的值,通常会使用一个临时变量:
//假设有两个已赋值的int型变量a、b
int temp;
temp=a; a=b; b=temp;
当然只是通常的做法,你也可以运用逻辑运算符:
a = a ^ b;
b = b ^ a;
a = b ^ a;
或者:b = a + (a = b) * 0;
但,在SQL中交换列值可以使用下面的语句:
Update dbo.T1 Set c1=c2,c2=c1;
你应该假设所有操作同时发生,而事实上,在更新完成之前并不会修改表(可以理解为更新过程中表中的记录被锁定),而在计算出所有结果之后替换了现有表中的源数据。
所以,下面的更新语句:
Update dbo.T1 Set c1=c1+(Select Max(c1) From dbo.T1);
该更新将影响T1表中的所有行,为C1列加上更新开始时T1中的最大的c1值。此时可以认为更新开始后表中的记录被锁住,数据库在后台处理、计算数据。计算完所有数据之后,将一次性替换所有数据。所以你不用担心最大的c1值会随着操作进行而持续变化,可以理解为操作在瞬间发生了。
原文发布时间为:2011-02-14
本文作者:vinoYang
本文来自云栖社区合作伙伴CSDN博客,了解相关信息可以关注CSDN博客。