zoukankan      html  css  js  c++  java
  • SQL Server 2005 CTE学习总结

         SQL Server 2005引入了一个很有价值的Tracsact-SQL组件:通用表表达式(Common Table Expression,CTE),它是一个可以由定义语句引用的临时命名的结果集,类似于引用派生表和视图的方式。

         1,简单的使用    

    USE AdventureWorks;
    GO
    --DirReps为CTE的名字,包含两个字段
    WITH DirReps(ManagerID, DirectReports) AS 
    (
        
    SELECT ManagerID, COUNT(*
        
    FROM HumanResources.Employee AS e
        
    WHERE ManagerID IS NOT NULL
        
    GROUP BY ManagerID
    )
    --返回表DirReps的内容
    SELECT ManagerID, DirectReports 
    FROM DirReps 
    ORDER BY ManagerID;
    GO

     

    USE AdventureWorks;
    GO
    WITH Sales_CTE (SalesPersonID, NumberOfOrders, MaxDate)
    AS
    (
        
    SELECT SalesPersonID, COUNT(*), MAX(OrderDate)
        
    FROM Sales.SalesOrderHeader
        
    GROUP BY SalesPersonID
    )
    --这里我们再一次的使用了CTE Sales_CTE
    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

         2,递归应用 

         利用CTE对一个表进行排序那是相当简单,我之前写过一个排序的例子,现在想想感觉很可笑。在同一个表内显示数据分级

         

    --创建原表
    create table #test
    (
     id 
    int,
     
    level int,
     pid 
    int,
     sortorder 
    int
    )
    --插入数据,假定有三级数据
    insert into #test select 1,0,0,1
    insert into #test select 2,1,1,2
    insert into #test select 3,0,0,3
    insert into #test select 4,1,3,4
    insert into #test select 5,0,0,5
    insert into #test select 6,1,1,6
    insert into #test select 7,2,4,7
    go
    --排序前
    SELECT * FROM #test
    go
    --排序后
    WITH CTE
    AS
    (
        
    SELECT *,cast('0' AS nvarchar(max)) + cast(ROW_NUMBER() OVER(PARTITION BY pid ORDER BY pid)AS nvarchar(20)) AS newsortorder FROM #test WHERE level = 0
        
    UNION ALL
        
    SELECT t.*,  (c.newsortorder + CAST(ROW_NUMBER() OVER(PARTITION BY t.pid ORDER BY t.pid) AS nvarchar(max))) AS newsortorder
        
    FROM #test t
        
    INNER JOIN CTE c ON t.pid = c.id
    )
    SELECT * FROM CTE ORDER BY newsortorder
    go
    DROP TABLE #test

    参考:使用SQL2005 递归查询结合Row_Number()实现完全SQL端树排序

    作者:冰碟
    出处:http://www.cnblogs.com/icebutterfly/
    版权:本文版权归作者和博客园共有
    转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
    要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
  • 相关阅读:
    简历的快速复制
    使用stringstream对象简化类型转换
    猴子吃桃
    new和delete运算符
    绘制正余弦曲线
    计算学生的平均成绩
    判断是否为回文字符串
    统计各种字符个数
    验证用户名
    回溯法(挑战编程)
  • 原文地址:https://www.cnblogs.com/icebutterfly/p/1402503.html
Copyright © 2011-2022 走看看