SQLServer2005杂谈.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
SQLServer2005杂谈

SQL Server2005杂谈SQL Server2005杂谈(1):使用公用表表达式(CTE)简化嵌套SQL 本文为原创,如需转载,请注明作者和出处,谢谢! ??? select?*?from?person.StateProvince?where?CountryRegionCode?in? ?????????(select?CountryRegionCode?from?person.CountryRegion?where?Name?like?C%) ??? 上面的查询语句使用了一个子查询。虽然这条SQL语句并不复杂,但如果嵌套的层次过多,会使SQL语句非常难以阅读和维护。因此,也可以使用表变量的方式来解决这个问题,SQL语句如下: declare?@t?table(CountryRegionCode?nvarchar(3)) insert?into?@t(CountryRegionCode)??(select?CountryRegionCode?from?person.CountryRegion?where?Name?like?C%) select?*?from?person.StateProvince?where?CountryRegionCode? ?????????????????????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 cr?as ( ????select?CountryRegionCode?from?person.CountryRegion?where?Name?like?C% ) select?*?from?person.StateProvince?where?CountryRegionCode?in?(select?*?from?cr) ??? 其中cr是一个公用表表达式,该表达式在使用上与表变量类似,只是SQL Server 2005在处理公用表表达式的方式上有所不同。 ??? 在使用CTE时应注意如下几点: 1.?CTE后面必须直接跟使用CTE的SQL语句(如select、insert、update等),否则,CTE将失效。如下面的SQL语句将无法正常使用CTE: with cr?as ( ????select?CountryRegionCode?from?person.CountryRegion?where?Name?like?C% ) select?*?from?person.CountryRegion??--?应将这条SQL语句去掉 --?使用CTE的SQL语句应紧跟在相关的CTE后面?-- select?*?from?person.StateProvince?where?CountryRegionCode?in?(select?*?from?cr) 2.?CTE后面也可以跟其他的CTE,但只能使用一个with,多个CTE中间用逗号(,)分隔,如下面的SQL语句所示: with cte1?as ( ????select?*?from?table1?where?name?like?abc% ), cte2?as ( ????select?*?from?table2?where?id??20 ), cte3?as ( ????select?*?from?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语句所示: ? --??table1是

文档评论(0)

xy88118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档