sql server中普通表表达式的优点是什么?

前端之家收集整理的这篇文章主要介绍了sql server中普通表表达式的优点是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们写下CTE sql,如下所示
WITH yourCTE AS 
(
 SELECT .... FROM :... WHERE.....
) SELECT * FROM yourCTE

sql放入块中会有什么好处.我认为如果我们把复杂的sql与块,那么我们只需要像SELECT * FROM yourCTE一样编写sql.好像我正在访问视图.
性能方面使用CTE的附加优势.请讨论.谢谢

解决方法

有一些CTE可以真正有用的情况:

>递归查询,比如走上一个层次结构树,这是非常棘手和繁琐的,没有CTE(见here for a sample of a recursive CTE)
>任何时候想使用其中一个排序函数,如ROW_NUMBER(),RANK(),NTILE()等等(见here for info on ranking functions)
一般情况下,您需要首先根据一些条件选择几行/列,然后再执行这些操作.更新表,删除重复等

一种情况我经常使用CTE来删除一组给定的数据的最新行,例如,如果你有客户和他们的订单有1:n的关系,并且你想删除除最新订单之外的所有订单(基于OrderDate),对于每个客户来说,在没有CTE的情况下,在sql中这样做是相当毛茸茸的.

有了CTE和排名功能,这很轻松:

;WITH CustomerOrders AS
(
    SELECT  
       c.CustomerID,o.OrderID,ROW_NUMBER() OVER(PARTITION BY c.CustomerID ORDER BY o.OrderDate DESC) AS 'RowN'
    FROM
       dbo.Customer c
    INNER JOIN
       dbo.Orders o ON o.CustomerID = c.CustomerID
)
DELETE FROM 
    dbo.Orders
FROM 
    CustomerOrders co
WHERE 
  dbo.Orders.OrderID = co.OrderID
  AND co.RowN > 1

通过这种方式,您可以创建一个由CustomerID分区的“内联视图”(例如,每个客户从1开始获取rownumbers),按OrderDate DESC(最新的顺序)排序.对于每个客户,最新的最新订单都有RowN = 1,因此您可以轻松地删除所有其他行,并且已经完成了您想要做的 – 一个带有CTE的蛋糕 – 没有它的凌乱的代码….

原文链接:https://www.f2er.com/mssql/76204.html

猜你在找的MsSQL相关文章