SQL2005数据库使用公用表表达式(CTE)简化嵌套SQL_SQL SERVER数据库_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

SQL数据库2005杂谈(1):使用公用表表达式(CTE)简化嵌套SQL

作者:黑客防线网安SQL维护基地 来源:黑客防线网安SQL维护基地 浏览次数:0

本篇关键词:简化使用数据库杂谈
黑客防线网安网讯:  先看下面一个嵌套的查询语句:select*fromperson.StateProvincewhereCountryRegionCodein    (selectCountryRegionCodefromperson.CountryRegionwhereNamelike'C%')  上面...

  先看下面一个嵌套的查询语句:

select*fromperson.StateProvincewhereCountryRegionCodein
    (selectCountryRegionCodefromperson.CountryRegionwhereNamelike'C%')

  上面的查询语句使用了一个子查询虽然这条SQL语句并不复杂但如果嵌套的层次过多会使SQL语句非常难以阅读和维护因此,也可以使用表变量的方式来解决这个问题,SQL语句如下:

declare@ttable(CountryRegionCodenvarchar(3))
insertinto@t(CountryRegionCode) (selectCountryRegionCodefromperson.CountryRegionwhereNamelike'C%')
select*fromperson.StateProvincewhereCountryRegionCode
          in(select*from@t)

  虽然上面的SQL语句要比第一种方式更复杂,但却将子查询放在了表变量@t中,这样做将使SQL语句更容易维护,但又会带来另一个问题,就是性能的损失。由于表变量实际上使用了临时表,从而增加了额外的I/O开销,因此,表变量的方式并不太适合数据量大且频繁查询的情况。为此,在SQL Server 2005中提供了另外一种解决方案,这就是公用表表达式(CTE),使用CTE,可以使SQL语句的可维护性,同时,CTE要比表变量的效率高得多。

  下面是CTE的语法:

[ WITH <common_table_expression> [ ,n ] ]
<common_table_expression>::=
    expression_name [ ( column_name [ ,n ] ) ]
  AS
    ( CTE_query_definition )

  现在使用CTE来解决上面的问题,SQL语句如下:

with
cras
(
  selectCountryRegionCodefromperson.CountryRegionwhereNamelike'C%'
)
select*fromperson.StateProvincewhereCountryRegionCodein(select*fromcr)

  其中cr是一个公用表表达式,该表达式在使用上与表变量类似,只是SQL Server 2005在处理公用表表达式的方式上有所不同。

  在使用CTE时应注意如下几点:

  1.CTE后面必须直接跟使用CTE的SQL语句(如select、insert、update等),否则,CTE将失效。如下面的SQL语句将无法正常使用CTE:

with
cras
(
  selectCountryRegionCodefromperson.CountryRegionwhereNamelike'C%'
)

  select*fromperson.CountryRegion --应将这条SQL语句去掉

  --使用CTE的SQL语句应紧跟在相关的CTE后面--

  select*fromperson.StateProvincewhereCountryRegionCodein(select*fromcr)

    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-9784-1.html
网站维护教程更新时间:2012-03-21 02:25:31  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer