一个SELECT语句引发的迭代(SELECT @local_variable = expression 的妙用)

李战 2006-04-03 01:20:45
一个SELECT语句引发的迭代(SELECT @local_variable = expression 的妙用)
作者:李战(leadzen)

  在用Transact-SQL编写程序过程中,经常会遇到针对某个查询的每一行记录进行某种迭代运算的操作。通常情况下,我们都会定义一个该查询的游标,然后用循环语句来取出每一行进行迭代处理。但对于某些计算性质的迭代,巧妙使用SELECT @local_variable = expression的形式却能取得更好的效果。

  我们来看看一个例子,有表T,只含一个字符字段F1,内容如下
T(F1)
------
A
B
C
D
E

  要求写一段Transact-SQL,返回'A,B,C,D,E'形式的结果,即将每一行记录用逗号串起来。这是一个典型的查询结果迭代操作。

  用游标来迭代可能的形式是:

declare @result varchar(8000)
declare @s varchar(32)
declare c cursor FORWARD_ONLY READ_ONLY for
select F1 from T order by F1
set @result = ''
open c
fetch next from c into @s
while @@fetch_status = 0
begin
set @result = case when @result='' then @s else @result + ',' + @s end
fetch next from c into @s
end
deallocate c
select @result

  但用SELECT @local_variable = expression的形式就可改成这样:

declare @result varchar(8000)
set @result = ''
select @result = @result + case when @result='' then F1 else ','+F1 end from T order by F1
select @result

  分析二者的执行计划发现,SELECT迭代法的执行计划比游标迭代法的执行计划简单多了,而且非常符合一般SELECT语句的执行计划。

  查看SQL Server的帮助文档是这样说的:

------------------------------------------------------------------------------
SELECT @local_variable

指定将(使用 DECLARE @local_variable 创建的)给定的局部变量设置为指定的表达式。

建议将 SET @local_variable 而不是 SELECT @local_variable 用于变量赋值。

......

注释

SELECT @local_variable 通常用于将单个值返回到变量中。例如,如果 expression 为列名,则返回多个值。如果 SELECT 语句返回多个值,则将返回的最后一个值赋给变量。

如果 SELECT 语句没有返回行,变量将保留当前值。如果 expression 是不返回值的标量子查询,则将变量设为 NULL。
......
-------------------------------------------------------------------------------

  注意其中的这句话“如果 SELECT 语句返回多个值,则将返回的最后一个值赋给变量”。
  虽然如此,但实际的执行结果的确都曾对每一行记录执行过@local_variable = expression,只是最后一行保留下来。

  而SELECT迭代的巧妙之处就是在expression表达式中又引用了@local_variable自身,很完美地将迭代计算融入SELECT语句内部的执行中!

  这样的迭代执行计划非常精简,又无需分配和释放游标,书写又精简,不能不说巧妙啊!

  感谢www.cndev.org的sea026和乌烟提供素材,以及各位大牛小牛的牛角尖啊...

李战(leadzen) 2006-3-24
...全文
248 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
撸大湿 2006-04-03
  • 打赏
  • 举报
回复
一般我们都 select @result = @result +","+ F1 from table where 条件
然后 stuff(..)
zlp321002 2006-04-03
  • 打赏
  • 举报
回复
--这种方式很多人都知道.
Guizhi 2006-04-03
  • 打赏
  • 举报
回复
mark
内容概要:本文提出了一种基于蒙特卡洛模拟与拉格朗日松弛法的分散式优化策略,用于解决电动汽车充电站在分时电价机制下的有序充电调度问题。通过蒙特卡洛方法模拟电动汽车充电行为的随机性,生成多样化负荷场景,构建以降低电网负荷波动和用户充电成本为目标的优化模型;采用拉格朗日松弛法对耦合约束进行解耦,实现分布式求解,在保障用户隐私的同时提升计算效率。文中设计了详细的仿真场景,系统分析了该调度策略对电网负荷特性和用户经济性的影响,验证了所提方法在实际应用中的有效性与可行性。; 适合人群:具备电力系统运行、优化算法理论及Matlab编程能力的研究生、科研人员以及从事智能电网与电动汽车相关领域的工程技术人员。; 使用场景及目标:①应用于城市规模化充电站集群的有序充电管理,实现电网“削峰填谷”;②为电力公司制定科学合理的分时电价政策提供量化分析工具;③支撑智能电网中需求侧资源的分布式协同优化调度研究与系统设计。; 阅读建议:建议结合提供的Matlab代码深入理解算法实现流程,重点掌握蒙特卡洛场景生成机制与拉格朗日松弛迭代求解过程,可通过调整参数设置复现不同工况下的仿真结果,以深化对分散式优化机制与调度效果之间关系的理解。
内容概要:本文研究了基于元胞神经网络配流与DQN强化学习的公交线网扰动韧性恢复方法,旨在应对公共交通系统中突发事件导致的网络扰动问题。通过结合元胞神经网络对交通流量进行精细化建模与分配,并利用深度Q网络(DQN)强化学习算法动态优化调度策略,实现公交线路在扰动后的快速恢复与运力再分配。研究构建了完整的仿真框架,在Matlab平台上实现了算法的编码与测试,验证了所提方法在提升公交系统韧性、减少乘客延误和优化资源利用方面的有效性。; 适合人群:具备一定交通工程、智能算法或强化学习基础,从事智慧交通、城市公交调度、韧性城市等方向研究的研究生、科研人员及工程技术开发者。; 使用场景及目标:①应用于城市公交系统在遭遇突发事件(如道路封闭、车辆故障、极端天气)时的应急调度与恢复决策;②为智能交通系统(ITS)提供基于AI的动态配流与优化控制方案;③推动强化学习在复杂交通网络管理中的落地实践; 阅读建议:建议读者结合Matlab代码深入理解算法实现细节,重点关注元胞神经网络的状态转移机制与DQN奖励函数的设计逻辑,并可通过调整扰动场景参数进行仿真实验,以掌握模型的适应性与优化潜力。

34,876

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧