zoukankan      html  css  js  c++  java
  • 通用表表达式(Common Table Expression)

    问题:编写由基本的 SELECT/FROM/WHERE 类型的语句派生而来的复杂 SQL 语句。

    方案1:编写在From子句内使用派生表(内联视图)的T-SQL查询语句。

    方案2:使用视图

    方案3:使用通用表达式(CTE)

    比较:

    视图:通常用于分解大型查询,无需在临时表中复制或存储数据,数据库中可以重复使用。

     1 CREATE VIEW vwMyView AS
     2 SELECT
     3     EmployeeID, COUNT(*) AS NumOrders,  MAX(OrderDate) AS MaxDate
     4 FROM Orders
     5 GROUP BY EmployeeID
     6 GO
     7 
     8 SELECT 
     9     e.EmployeeID, oe.NumOrders, oe.MaxDate, e.ReportsTo AS ManagerID, 
    10     om.NumOrders, om.MaxDate
    11 FROM 
    12     Employees AS e
    13     INNER JOIN vwMyView AS oe ON e.EmployeeID = oe.EmployeeID
    14     INNER JOIN vwMyView AS om ON e.ReportsTo = om.EmployeeID

    派生表:只能在派生表所在的语句中访问它们,使查询变得更难以阅读和维护(若同一个批处理中要多次使用派生表,必须复制粘贴派生表)

     1 SELECT 
     2     e.EmployeeID, oe.NumOrders, oe.MaxDate,  e.ReportsTo AS ManagerID, 
     3     om.NumOrders, om.MaxDate
     4 FROM 
     5     Employees AS e
     6     INNER JOIN 
     7         (SELECT EmployeeID, COUNT(*), MAX(OrderDate)
     8          FROM Orders
     9          GROUP BY EmployeeID) AS oe(EmployeeID, NumOrders, MaxDate)
    10         ON e.EmployeeID = oe.EmployeeID
    11     LEFT JOIN 
    12         (SELECT EmployeeID, COUNT(*), MAX(OrderDate)
    13          FROM Orders
    14          GROUP BY EmployeeID) AS om(EmployeeID, NumOrders, MaxDate)
    15         ON e.ReportsTo = om.EmployeeID

    CET:提升了 T-SQL 的可读性(就像视图一样),在同一个批处理后紧跟的查询中多次使用,不会在内部创建临时表或虚拟表

     1 ;WITH EmpOrdersCTE (EmployeeID, NumOrders, MaxDate) AS
     2 (
     3   SELECT EmployeeID, COUNT(*), MAX(OrderDate)
     4   FROM Orders
     5   GROUP BY EmployeeID
     6 )
     7 
     8 SELECT 
     9     e.EmployeeID,  oe.NumOrders, oe.MaxDate,
    10     e.ReportsTo AS ManagerID,  om.NumOrders, om.MaxDate
    11 FROM 
    12     Employees AS e
    13     INNER JOIN EmpOrdersCTE oe ON e.EmployeeID = oe.EmployeeID
    14     LEFT JOIN EmpOrdersCTE om ON e.ReportsTo = om.EmployeeID
  • 相关阅读:
    HTML和CSS之HTML(记录一2015.3.30)
    jquery学习记录三(表单选择器)
    jquery学习记录四(操作DOM元素)
    jquery学习记录二(过滤性选择器)
    jquery学习记录一(基础选择器)
    聚集索引和非聚集索引
    git命令
    4,gps信号与地图匹配算法
    3,gps定位原理及格式
    2,地图数据分析-地图数据转换成导航引擎数据
  • 原文地址:https://www.cnblogs.com/niaomingjian/p/3807008.html
Copyright © 2011-2022 走看看