【发布时间】:2015-01-28 00:11:29
【问题描述】:
我知道如何使用派生表,但我仍然看不出使用派生表有什么真正的好处。
例如,在下面的文章http://techahead.wordpress.com/2007/10/01/sql-derived-tables/ 中,作者试图通过一个示例展示使用派生表的查询相对于没有派生表的查询的好处,我们希望生成一份报告,显示每个订单的总数客户在 1996 年下订单,我们希望此结果集包括所有客户,包括当年未下过任何订单的客户和从未下过订单的客户(他正在使用 Northwind 数据库)。
但是当我比较这两个查询时,我看不到使用派生表的查询的任何优点(如果没有别的,使用派生表似乎并没有简化我们的代码,至少在这个例子中没有) :
常规查询:
SELECT C.CustomerID, C.CompanyName, COUNT(O.OrderID) AS TotalOrders
FROM Customers C LEFT OUTER JOIN Orders O ON
C.CustomerID = O.CustomerID AND YEAR(O.OrderDate) = 1996
GROUP BY C.CustomerID, C.CompanyName
使用派生表查询:
SELECT C.CustomerID, C.CompanyName, COUNT(dOrders.OrderID) AS TotalOrders
FROM Customers C LEFT OUTER JOIN
(SELECT * FROM Orders WHERE YEAR(Orders.OrderDate) = 1996) AS dOrders
ON
C.CustomerID = dOrders.CustomerID
GROUP BY C.CustomerID, C.CompanyName
也许这不是一个很好的例子,所以你能告诉我一个派生表的好处更明显的例子吗?
感谢
回复 GBN:
在这种情况下,如果客户和产品之间没有关系,您就无法同时捕获产品和订单聚合。
你能详细说明你的意思吗?以下查询会不会产生与您的查询相同的结果集:
SELECT
C.CustomerID, C.CompanyName,
COUNT(O.OrderID) AS TotalOrders,
COUNT(DISTINCT P.ProductID) AS DifferentProducts
FROM Customers C LEFT OUTER JOIN Orders O ON
C.CustomerID = O.CustomerID AND YEAR(O.OrderDate) = 1996
LEFT OUTER JOIN Products P ON
O.somethingID = P.somethingID
GROUP BY C.CustomerID, C.CompanyName
回复 CADE ROUX:
此外,如果使用表达式从具有大量共享中间计算的派生列派生列,则一组嵌套派生表或堆叠 CTE 是唯一的方法:
SELECT x, y, z1, z2
FROM (
SELECT *
,x + y AS z1
,x - y AS z2
FROM (
SELECT x * 2 AS y
FROM A
) AS A
) AS A
以下查询会不会产生与上述查询相同的结果:
SELECT x, x * 2 AS y, x + x*2 AS z1, x - x*2 AS z2
FROM A
【问题讨论】:
标签: sql sql-server tsql