• 使用公用表表达式


    本文来自:http://msdn.microsoft.com/zh-cn/library/ms190766(v=sql.90).aspx

    公用表表达式 (CTE) 可以认为是在单个 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 语句的执行范围内定义的临时结果集。CTE 与派生表类似,具体表现在不存储为对象,并且只在查询期间有效。与派生表的不同之处在于,CTE 可自引用,还可在同一查询中引用多次。

    CET 可用于:

    • 创建递归查询。有关详细信息,请参阅使用公用表表达式的递归查询
    • 在不需要常规使用视图时替换视图,也就是说,不必将定义存储在元数据中。
    • 启用按从标量嵌套 select 语句派生的列进行分组,或者按不确定性函数或有外部访问的函数进行分组。
    • 在同一语句中多次引用生成的表。

    使用 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 包含三个列(SalesPersonIDNumberOfOrders 和 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
    
    

    以下为部分结果集:

     
     
    EmployeeID  NumberOfOrders MaxDate  ManagerID NumberOfOrders MaxDate
    ----------- -------------- ---------- --------- -------------- ----------
    268         48             2004-06-01 273       NULL           NULL
    275         450            2004-06-01 268       48             2004-06-01
    276         418            2004-06-01 268       48             2004-06-01
    277         473            2004-06-01 268       48             2004-06-01
    
  • 相关阅读:
    BZOJ-1497 最大获利
    POJ-3680 Intervals & NOI 2008 志愿者招募 费用流
    CodeForces 663E Binary Table
    南昌区域赛-G Eating Plan
    HDU-5909 Tree Cutting
    BZOJ-4589 Hard Nim
    UVA-12633 Super Rooks on Chessboard
    SPOJ-TSUM Triple Sums
    HDU-4609 3-idiots
    Kattis-aplusb A+B problem
  • 原文地址:https://www.cnblogs.com/zhouyunbaosujina/p/4054808.html
Copyright © 2020-2023  润新知