sql之with as 公用表表达式

sql 中的with as 具有强大的功能,特别是在有递归需要的情况下,一般来说结合union all一起用。

示例如下:

with w_Users(UserId) as  
                                (  
                                select UserId from Users where UserId={0}  
                                union   all 
                                select U.UserId  from Users U,w_Ext_Users w where U.MyUpper=W.UserId  
                                )  
                                select sum(PayMoney) from Cost where Users_ids in (
                                select UserId from  w_Users 
                                )
                                ) and 
                                BackTime between {3} and {4} and InSuccess=1 and  PaySuccess=1"

1、with as 作为一种临时表类似的机制,但是它只是将查询结果集存在于内存中;

2、查询的结果(本例中为w_Users)必须在其后的第一个sql(可以是增删改查语句)语句中使用,后续的第二个便无效;

3、with as内的查询不能有赋值操作;

4、with as 与()内的包含union all的查询,可以构成复杂、功能强大的递归查询。它把union all之前的语句第一次运行结果作为递归原点,当作存入w_Users,然后再运行union all后面的递归语句得到结果集T0,并把它当作w_Users;然后再运行union all后的递归语句,得到T1...直到返回集为空为止。然后把每一次的返回结果T0至Tn的结果union all起来,即得到最后的w_Users;

5、可以多个with as 连用,但是后续的只要用逗号及小括号连接即可;

6、with as前的最后一个语句要以";"结束;

7、不能在 CTE_query_definition 中使用以下子句:
(1)COMPUTE 或 COMPUTE BY
(2)ORDER BY(除非指定了 TOP 子句)
(3)INTO
(4)带有查询提示的 OPTION 子句
(5)FOR XML
(6)FOR BROWSE

公用表表达式在查询具有层次或者树型结构的数据中相当有用。

另外,具有相似功能的SQL特性有:临时表、临时表变量、中间表达式。

仅供参阅。

参见:

https://technet.microsoft.com/zh-cn/library/ms186243(v=sql.105).aspx


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值