• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

SQL Server2005杂谈(1):使用公用表表达式(CTE)简化嵌套SQL

mysql 搞代码 4年前 (2022-01-09) 33次浏览 已收录 0个评论

转自: 李宁的极客世界 先看下面一个嵌套的查询语句: person.StateProvince where CountryRegionCode in ( ) (CountryRegionCode nvarchar ( 3 )) (CountryRegionCode) ( ) person.StateProvince where CountryRegionCode )来源gaodai#ma#com搞@代~码$网 虽然上面的 SQL 语句要比第一种

转自:

李宁的极客世界

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

person.StateProvince where CountryRegionCode in()

(CountryRegionCode nvarchar(3))(CountryRegionCode) ()person.StateProvince where CountryRegionCode)

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

]<common_table_expression>::=expression_name ) ]AS( CTE_query_definition )

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

withcr as()person.StateProvince cr)

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

在使用CTE时应注意如下几点:
1. CTE后面必须直接跟使用CTESQL语句(如selectinsertupdate等),否则,CTE将失效。如下面的SQL语句将无法正常使用CTE

withcr as()person.CountryRegion 应将这条SQL语句去掉person.StateProvince cr)

2. CTE后面也可以跟其他的CTE,但只能使用一个with,多个CTE中间用逗号(,)分隔,香港虚拟主机,如下面的SQL语句所示:

withcte1 as(table1 ),cte2 as(table2 where id > 20),cte3 as(table3 where price < 100)select a.* from cte1 a, cte2 b, cte3 c where a.id = b.id and a.id = c.id

3. 如果CTE的表达式名称与某个数据表或视图重名,则紧跟在该CTE后面的SQL语句使用的仍然是CTE,当然,后面的SQL语句使用的就是数据表或视图了,服务器空间,如下面的SQL语句所示:

withtable1 as(persons where age < 30)table1 table1 使用了名为table1的数据表

4. CTE 可以引用自身,也可以引用在同一 WITH 子句中预先定义的 CTE。不允许前向引用。

5. 不能在 CTE_query_definition 中使用以下子句:

1COMPUTE COMPUTE BY

2ORDER BY(除非指定了 TOP 子句)

3INTO

4)带有查询提示的 OPTION 子句

5FOR XML

6FOR BROWSE

6. 如果将 CTE 用在属于批处理的一部分的语句中,那么在它之前的语句必须以分号结尾,如下面的SQL所示:

(3); t_tree as(select CountryRegionCode from person.CountryRegion where Name like @s)person.StateProvince t_tree)

CTE除了可以简化嵌套SQL语句外,还可以进行递归调用,关于这一部分的内容将在下一篇文章中介绍。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:SQL Server2005杂谈(1):使用公用表表达式(CTE)简化嵌套SQL

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址