SQL技巧(三) - CTE实战之代替临时表

一段复杂的逻辑,原先的代码我使用#tmp临时表来实现,性能是不好的,而且要考虑到多用户时的锁的问题

代码如下:

declare @StartDate datetime
declare @EndDate datetime
select @StartDate='2012-09-28'
select @EndDate='2012-10-03'

if exists (select * from tempdb..sysobjects where name like '#tmpPolicyId%')
    drop table #tmpPolicyId
if exists (select * from tempdb..sysobjects where name like '#tmpSeasonFee%')
    drop table #tmpSeasonFee
if exists (select * from tempdb..sysobjects where name like '#tmpSpecialFee%')
    drop table #tmpSpecialFee
 
select PolicyId
into #tmpPolicyId
from GvInterPolicy
group by PolicyId

select tmp.PolicyId, max(AddFee) as SeasonFee
into #tmpSeasonFee
from #tmpPolicyId tmp inner join GvSeasonFee season
    on tmp.PolicyId=season.PolicyId
where season.StartDate<=@StartDate and season.EndDate>=@StartDate 
group by tmp.PolicyId

select tmp.PolicyId, max(AddFee) as SpecialFee
into #tmpSpecialFee
from #tmpPolicyId tmp inner join GvSpecialFee special
    on tmp.PolicyId=special.PolicyId
where special.SpecialDate=@StartDate
group by tmp.PolicyId

select p.PolicyId, p.AirComCode, p.DepStartTime, p.DepEndTime, p.SellStartTime, p.SellEndTime,
        p.StartCityCode, p.EndCityCode, r.FlightNo, r.SCityCode, r.ECityCode, r.STime, r.ETime,
        r.TerminalBuilding, r.RouteOrder, r.SCityName, r.ECityName, r.PlaneModel, r.IsBack,
        c.FirstCabin, c.SecondCabin, c.Price as AdultPrice, 
        isnull(season.SeasonFee, 0) as SeaFee, isnull(special.SpecialFee, 0) as SpFee,
        AddPrice=case when isnull(season.SeasonFee, 0)>=isnull(special.SpecialFee, 0) then isnull(season.SeasonFee, 0) else isnull(special.SpecialFee, 0) end
from GvInterPolicy p inner join GvRouteInfo r
    on p.PolicyId=r.PolicyId inner join GvCabinInfo c
    on p.PolicyId=c.PolicyId left join #tmpSeasonFee season
    on p.PolicyId=season.PolicyId left join #tmpSpecialFee special
    on p.PolicyId=special.PolicyId 
where p.DepStartTime<=@StartDate and p.DepEndTime>=@EndDate
order by p.PolicyId, c.FirstCabin, c.SecondCabin, r.RouteOrder

 

使用CTE改进后的代码:

declare @StartDate datetime
declare @EndDate datetime
select @StartDate='2012-09-28'
select @EndDate='2012-10-03';

with ctePolicyId(PolicyId)
as
(
    select PolicyId
    from GvInterPolicy
    group by PolicyId
),
cteSeasonFee
as
(
    select p.PolicyId, max(AddFee) as SeasonFee
    from ctePolicyId p inner join GvSeasonFee season
        on p.PolicyId=season.PolicyId
    where season.StartDate<=@StartDate and season.EndDate>=@StartDate 
    group by p.PolicyId
),
cteSpecialFee
as
(
    select p.PolicyId, max(AddFee) as SpecialFee
    from ctePolicyId p inner join GvSpecialFee special
        on p.PolicyId=special.PolicyId
    where special.SpecialDate=@StartDate
    group by p.PolicyId

)

select p.PolicyId, p.AirComCode, p.DepStartTime, p.DepEndTime, p.SellStartTime, p.SellEndTime,
        p.StartCityCode, p.EndCityCode, r.FlightNo, r.SCityCode, r.ECityCode, r.STime, r.ETime,
        r.TerminalBuilding, r.RouteOrder, r.SCityName, r.ECityName, r.PlaneModel, r.IsBack,
        c.FirstCabin, c.SecondCabin, c.Price as AdultPrice, 
        isnull(season.SeasonFee, 0) as SeaFee, isnull(special.SpecialFee, 0) as SpFee,
        AddPrice=case when isnull(season.SeasonFee, 0)>=isnull(special.SpecialFee, 0) then isnull(season.SeasonFee, 0) else isnull(special.SpecialFee, 0) end
from GvInterPolicy p inner join GvRouteInfo r
    on p.PolicyId=r.PolicyId inner join GvCabinInfo c
    on p.PolicyId=c.PolicyId left join cteSeasonFee season
    on p.PolicyId=season.PolicyId left join cteSpecialFee special
    on p.PolicyId=special.PolicyId 
where p.DepStartTime<=@StartDate and p.DepEndTime>=@EndDate
order by p.PolicyId, c.FirstCabin, c.SecondCabin, r.RouteOrder

 

 

时间: 2024-09-28 18:19:29

SQL技巧(三) - CTE实战之代替临时表的相关文章

SQL技巧(二) - CTE(公用表达式)初步接触

CTE - Common Table Expression(公用表达式)是SQL 2005最重要的改进之一. 子查询有时候使用起来嵌套很复杂, 而使用#tmp类似的临时表, 性能又比较差. 这个时候,介于两者之间的解决方案,CTE诞生了. 我们可以用它来替代临时表 在使用CTE时应注意如下几点: 1. CTE后面必须直接跟使用CTE的SQL语句(如select.insert.update等),否则,CTE将失效 2. CTE后面也可以跟其他的CTE,但只能使用一个with,多个CTE中间用逗号(

SQL Server:在T-SQL中使用临时表需要注意的问题

在使用T-SQL编写触发器或者函数的时候,经常需要用到一个临时表.本文向您介绍使用T-SQL临时表需要注意的事项. 一.临时表的两种表现形式. 在SQL Server数据库中,临时表主要有两种形式,分别为全局临时表与局部临时表.这两种表有很大的不同,主要体现在名字上.可见性上以及可用性上.具体来说,本地临时表的名字是以#符号开头的;而全局临时表则是以##两个#字符号开头.从可见性上来说,局部临时表是有当前用户创建的,并且只有当前用户的会话才可以访问.而对于全局表来说,只要这个临时表存在,那么用户

WPS 2007使用技巧三则

国产办公软件WPS Office 2007以小巧的身形却实现了微软Office大部分的功能,综合来说应该是一个非常不错的办公软件.今天我们王二大家介绍三则关于WPS Office 2007的使用技巧. 技巧一:获得漂亮的拼音效果 语文试卷中一般都会有根据拼音写汉字的题目,利用WPS文字2007可以很轻松的实现这个要求.首先 在文档中正常输入需要注音的汉字,例如"暖风熏得游人醉,直把杭州作汴州",选中这些 诗句,依次选择"格式"→"中文版本"→&q

【Silverlight】 Bing Maps开发应用与技巧三:Bing Maps Silverlight Control

[Silverlight] Bing Maps开发应用与技巧三:Bing Maps Silverlight Control的离线开发 我相信大多数使用Bing Maps开发的朋友都见过如下的画面,就是当我们在开发Bing Maps的时候,将开发KEY填写错误导致用户授权验证失败出现的下图提示错误. 使用Bing Maps Silverlight Control开发的缺点就在于它默认是使用的微软自己提供的在线地图数据,而且Bing Maps Silverlight Control还与开发者账号进行

使用Office2010截图、抠图技巧三:自定义用户界面

技巧三:自定义用户界面 Office2010的用户界面可以根据我们的需要自行定义,操作也是相当的简单.单击左上角的Office按钮进入配置面板,选择 "CustomRibbon",在这里可以对所有的标签页.按钮进行定制,例如可以调整各个选项卡的位置.删除选项卡,也可以将原本显示为英文的对象更改为中文,只要选定之后单击右下角的"Rename"按钮即可重命名,利用这一功能可以对用户界面进行"汉化". 切换到"QuickaccessToolb

多屏复杂动画CSS技巧三则

  当下CSS3应用已经相当广泛,其中重要成员之一就是CSS3动画.并且,随着CSS动画的逐渐深入与普及,更复杂与细腻的动画场景也如雨后春笋般破土而出.   例如上个月做的「企业QQ-新年祝福」活动:   虽然视频内容是手机上的显示效果,但是,这个"企业新年祝福活动"原本只针对桌面端,移动端是后来辅助增强(增加了相当于活动页面UV 5.7%的点击).而目前大多数类似页面只针对移动端,例如其他同事实现的QQ空间5.0预约页第二版: 扫码(需登录)或者链接二选一: 因此,需要多一点适配的技

DB2编程序技巧 (三)_DB2

正在看的db2教程是:DB2编程序技巧 (三).  另一种为       pcursor1: for loopcs1 as  cousor1  cursor  as select  market_code  as market_code            from tb_market_code            for update         do         end for;        这种方式的优点是比较简单,不用(也不允许)使用open,fetch,close.   

暴风影音&quot;时尚&quot;技巧三则

作为对 Windows Media Player 的补充和完善,当前暴风影音定位为一种软件的整合和服务而存在,而非一个特定的软件.它提供和升级了系统对常见绝大多数影音文件和流的支持,包括 :RealMedia.QuickTime.MPEG2.MPEG4 (ASP/AVC).VP3/6/7.Indeo.FLV 等流行http://www.aliyun.com/zixun/aggregation/18234.html">视频格式:AC3/DTS/LPCM/AAC/OGG/MPC/APE/FLA

用友郑雨林:企业互联网化三条实战经验

本文讲的是用友郑雨林:企业互联网化三条实战经验,伴随着十三五规划的出台,我们看到互联网+.中国制造2025已经成为未来发展的重点,这无论是对于企业,还是产业界都是非常得利好的消息.但同时,我们也可以看到,很多的产业特别是传统的实体经济如制造业目前的现状并不是很理想,许多企业活在"水深火热"当中. 企业互联网三条实战经验 一方面面对前景无限的市场,另一方面反差巨大的现实,那么,中国的制造企业如何去找到转型的路径呢? 从发展趋势来看,行业企业互联网已经成为趋势,已经成为企业特别是制造业转型