SQL- With as 用法

SQL With As用法一.WITH AS的含义用AS语言,也叫做子查询部分(subquery factoring),可以定义一个SQL片断,该SQL片断会被整个SQL语句用到。可以使用SQL语句的可读性更高,也可以在UNION ALL的不同部分,作为提供数据的部分。对于UNION ALL,使用与AS定义了一个UNION ALL语句,当该片断被调用2次以上,优化器会自动将该WITH AS短语所获取的数据放入一个Temp表中。而提示meterialize则是强制将WITH AS短语的数据放入一个全局临时表中。很多查询通过该方式都可以提高速度。二。使用方法先看下面一个嵌套的查询语句:SELECT * FROM person.StateProvince其中CountryRegionCode在(从person.CountryRegion选择CountryRegionCode,其中名称如 'C%')上面的查询语句使用了一个子查询虽然这条SQL语句并不复杂,但如果嵌套的层次过多,会使用SQL语句非常难以阅读和维护。因此,也可以使用表变量的 来解决这个问题,SQL语句如下:声明@t表(CountryRegionCode nvarchar的的(3))插入@t(CountryRegionCode)(从person.CountryRegion中选择CountryRegionCode,其中名称为 'C%')

select * from person.StateProvince其中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语句如下:

复制代码用Cr作为(从person.CountryRegion选择CountryRegionCode,其中名称就像 'C%')SELECT * FROM person.StateProvince其中CountryRegionCode在(SELECT * FROM CR)复制代码其中CR是一个公用表表达式,该表达在使用上与表变量类似,只是SQL Server 2005中在处理公用表表式的方式上有所不同。在使用CTE时应注意如下几点:1.CTE后面必须直接跟使用CTE的SQL语句(如选择,插入,更新等),否则,CTE将失效如下面的SQL语句将无法正常使用CTE:复制代码与Cr作为(从person.CountryRegion选择CountryRegionCode,其中名称如 'C%')SELECT * FROM person.CountryRegion - - 应用这条SQL语句去掉 - 使用CTE的SQL语句应紧跟在相关的CTE后面 - SELECT * FROM person.StateProvince其中CountryRegionCode在(SELECT * FROM CR)复制代码2.CTE后面也可以跟其他的CTE,但只能使用一个,多个CTE中间用逗号(,)分隔,如下面的SQL语句所示:复制代码与cte1 as(select * from table1 where name like'abc%'),cte2 as(

select * from table2,其中id> 20),cte3 as(select * from table3,其中price <100)from cte1 a,cte2 b,cte3 c中选择a。*,其中a.id = b.id和a。 id = c.ID复制代码3.如果CTE的表达式名称与某个数据表或视图重名,则紧跟在该CTE后面的SQL语句使用的仍然是热膨胀系数,当然,后面的SQL语句使用的就是数据表或视图了,如下面的SQL语句所示:复制代码 -  table1是一个实际存在的表,其中table1为(选择*来自年龄<30的人)select * from table1  - 使用了名为table1的公共表表达式select * from table1  - 使用了名为table1的数据表复制代码4.CTE可以引用自身,也可以引用在同一与子句中预先定义的CTE。不允许前向引用。复制代码 - 使用使用DirectReports(ManagerID,EmployeeID,EmployeeLevel)AS (    SELECT ManagerID,EmployeeID,0 AS EmployeeLevel     FROM HumanResources.Employee     WHERE ManagerID IS NULL )递归公用表表达式显示递归的多个级别     UNION ALL     SELECT e.ManagerID,e.EmployeeID,EmployeeLevel + 1































FROM HumanResources.Employee e         INNER JOIN DirectReports d         ON e.ManagerID = d.EmployeeID )SELECT ManagerID ,EmployeeID,EmployeeLevel FROM DirectReports; - 使用递送公用表表达式显示递归的两个级别WITH DirectReports(ManagerID,EmployeeID,EmployeeLevel)AS (    SELECT ManagerID,EmployeeID,0 AS EmployeeLevel     FROM HumanResources.Employee     WHERE ManagerID IS NULL     UNION ALL     SELECT e.ManagerID,e。 EmployeeID,EmployeeLevel + 1     FROM HumanResources.Employee e         INNER JOIN DirectReports d         ON e.ManagerID = d.EmployeeID )SELECT ManagerID ,EmployeeID,EmployeeLevel

FROM DirectReports
WHERE EmployeeLevel <= 2

- 使用递归公用表表达式显示
层次列表与DirectReports(名称,标题,EmployeeID,EmployeeLevel,排序)
AS(SELECT CONVERT(varchar(255),c.FirstName +''+ c.LastName),
e.Title,
e .EmployeeID,
1,
CONVERT(varchar(255),c.FirstName +''+ c.LastName)
FROM HumanResources.Employee AS e
JOIN Person.Contact AS c ON e.ContactID = c.ContactID
WHERE e.ManagerID IS NULL
UNION ALL
SELECT CONVERT(varchar(255),REPLICATE('|',EmployeeLevel)+
c.FirstName +''+ c.LastName),
e.Title,
e.EmployeeID,
EmployeeLevel + 1,
CONVERT(varchar(255),RTRIM(Sort)+'|'+ FirstName +''+
LastName)
FROM HumanResources.Employee as e
JOIN Person.Contact AS c ON e.ContactID = c.ContactID
JOIN DirectReports AS d ON e。 ManagerID = d.EmployeeID

SELECT EmployeeID,Name,Title,EmployeeLevel
FROM DirectReports
ORDER BY Sort

- 使用MAXRECURSION取消一条语句
- 可以使用MAXRECURSION来防止不合理的递归CTE进入无限循环。以下示例特意创建了一个无限循环,然后使用MAXRECURSION提示将递归级别限制为两级
WITH cte (EmployeeID,ManagerID,Title)如

SELECT雇员,经理ID,标题
FROM HumanResources.Employee
WHERE经理ID IS NOT NULL
UNION ALL
SELECT cte.EmployeeID,cte.ManagerID,cte.Title
FROM CTE
JOIN HumanResources.Employee为e
ON cte.ManagerID = e.EmployeeID

-Uses MAXRECURSION将递归级别限制为2
SELECT EmployeeID,ManagerID,Title
FROM
cte OPTION(MAXRECURSION 2)
- 在更正代码错误之后,就不再需要MAXRECURSION。以下示例显示了更正后的代码
WITH cte(EmployeeID,ManagerID,Title)
AS

SELECT EmployeeID,ManagerID,Title
FROM HumanResources.Employee
WHERE ManagerID IS NOT NULL
UNION ALL
SELECT e.EmployeeID,e.ManagerID,e.Title
FROM HumanResources.Employee AS e
JOIN cte ON e .ManagerID = cte.EmployeeID
)SELECT EmployeeID,ManagerID,Title FROM cte复制代码5.不能在CTE _ query _ definition中使用以下子句:(1)COMPUTE或COMPUTE BY(2)ORDER BY(除非指定了TOP子句)(3)INTO (4)带有查询提示的OPTION子句(5)for XML(6)for BROWSE 6.如果将CTE用于属于批处理的一部分的语句中,那么在它之前的语句必须以分号结尾,如下面的SQL所示:复制代码声明@s nvarchar(3)设置@s ='C%'; - 必须加分号与t _ tree为(从person.CountryRegion选择CountryRegionCode其中类似@s名称)SELECT * FROM person.StateProvince其中CountryRegionCode中(选择t _ tree *)复制代码

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WITH AS语法在SQL Server用于创建可复用的查询结果集。它可以让你在整个SQL语句使用定义的查询片段。这种语法在提高SQL语句的可读性和提高性能方面非常有用。 使用WITH AS语法的格式如下: WITH 表名 AS (查询语句) SELECT * FROM 表名 例如,假设我们想要查询person.StateProvince表属于以字母C开头的CountryRegion的数据,可以使用WITH AS语法进行优化,示例如下: WITH CRegions AS ( SELECT CountryRegionCode FROM person.CountryRegion WHERE Name LIKE 'C%' ) SELECT * FROM person.StateProvince WHERE CountryRegionCode IN (SELECT CountryRegionCode FROM CRegions) 在这个示例,我们使用了WITH AS语法创建了一个名为CRegions的临时表,该临时表包含了以字母C开头的CountryRegionCode。然后我们在主查询使用了这个临时表来筛选出person.StateProvince表相应的数据。 总之,WITH AS语法可以让你更好地组织和重用查询片段,在提高可读性和性能方面非常有帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [SQLserver With As 用法](https://blog.csdn.net/ChengR666/article/details/120249691)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [数据库:SQLServerwith as 用法笔记](https://blog.csdn.net/xishining/article/details/108301525)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值