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