当前位置: 首页 > 工具软件 > asSQL > 使用案例 >

sql之with as 公用表表达式

令狐增
2023-12-01

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


 类似资料: