博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL Server同时操作(all-in-once)特性
阅读量:7083 次
发布时间:2019-06-28

本文共 861 字,大约阅读时间需要 2 分钟。

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型变量ab

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博客。

转载地址:http://urmml.baihongyu.com/

你可能感兴趣的文章
Spark 性能相关參数配置具体解释-任务调度篇
查看>>
oracle 10g/11g RAC 启停归档模式
查看>>
MongoDB 删除数据库
查看>>
Centos6 Nginx安装
查看>>
python 11 函数名 迭代器
查看>>
oracle归档日志管理
查看>>
两个链表的第一个公共节点
查看>>
类代码
查看>>
js的闭包原理理解
查看>>
Android AIDL 一探究竟
查看>>
P问题、NP问题和NPC问题
查看>>
vmwear导出OVF模板解析(解决ovf导入服务器失败问题,虚拟机版本等)
查看>>
Nginx 的两种认证方式
查看>>
mysql连表分组报错---- sql_mode=only_full_group_by问题解决
查看>>
让 scrollview动起来,
查看>>
第二周作业
查看>>
Surrounded Regions
查看>>
NodeJS学习笔记之MongoDB模块
查看>>
有趣的js题目
查看>>
OVN conntrack flag
查看>>