| 发表于:2007-02-27 10:46:182楼 得分:0 |
公用表表达式 (cte) 可以认为是在单个 select、insert、update、delete 或 create view 语句的执行范围内定义的临时结果集。cte 与派生表类似,具体表现在不存储为对象,并且只在查询期间有效。与派生表的不同之处在于,cte 可自引用,还可在同一查询中引用多次。 cet 可用于: 创建递归查询。有关详细信息,请参阅使用公用表表达式的递归查询。 在不需要常规使用视图时替换视图,也就是说,不必将定义存储在元数据中。 启用按从标量嵌套 select 语句派生的列进行分组,或者按不确定性函数或有外部访问的函数进行分组。 在同一语句中多次引用生成的表。 使用 cte 可以获得提高可读性和轻松维护复杂查询的优点。查询可以分为单独块、简单块、逻辑生成块。之后,这些简单块可用于生成更复杂的临时 cte,直到生成最终结果集。 可以在用户定义的例程(如函数、存储过程、触发器或视图)中定义 cte。 cte 的结构 cte 由表示 cte 的表达式名称、可选列列表和定义 cet 的查询组成。定义 cte 后,可以在 select、insert、update 或 delete 语句中对其进行引用,就像引用表或视图一样。cte 也可用于 create view 语句,作为定义 select 语句的一部分。 cte 的基本语法结构如下: with expression_name [ ( column_name [,...n] ) ] as ( cte_query_definition ) 只有在查询定义中为所有结果列都提供了不同的名称时,列名称列表才是可选的。 运行 cte 的语句为: select <column_list> from expression_name 示例 下面的示例显示了 cte 结构的组件:表达式名称、列列表和查询。cte 表达式 sales_cte 包含三个列(salespersonid、numberoforders 和 maxdate),在每个销售人员 salesorderheader 表中被定义为销售订单总数和最近销售订单日期。执行语句时,cte 将被引用两次:一次返回为销售人员所选的列,另一次检索销售经理的类似详细信息。销售人员和销售经理的数据都返回在一行中。 复制代码 use adventureworks; go with sales_cte (salespersonid, numberoforders, maxdate) as ( select salespersonid, count(*), max(orderdate) from sales.salesorderheader group by salespersonid ) select e.employeeid, os.numberoforders, os.maxdate, e.managerid, om.numberoforders, om.maxdate from humanresources.employee as e join sales_cte as os on e.employeeid = os.salespersonid left outer join sales_cte as om on e.managerid = om.salespersonid order by e.employeeid; go | | |
|