SQL语句应当如何使用内嵌视图与临时表

王朝mssql·作者佚名  2008-06-01
窄屏简体版  字體: |||超大  

许多情况下,查询需要将数据与其他一些可能只能通过执行 GROUP BY 然后执行标准查询才能收集的数据进行联接。例如,如果要查询最新五个定单的有关信息,您首先需要知道是哪些定单。这可以使用返回定单 ID 的 SQL 查询来检索。此数据就会存储在临时表(这是一个常用技术)中,然后与 Products 表进行联接,以返回这些定单售出的产品数量:

CREATE TABLE #Temp1 (OrderID INT NOT NULL, _

OrderDate DATETIME NOT NULL)INSERT INTO #Temp1 (OrderID, OrderDate)SELECT

TOP 5 o.OrderID, o.OrderDateFROM Orders o ORDER BY o.OrderDate DESCSELECT

p.ProductName, SUM(od.Quantity) AS ProductQuantityFROM #Temp1 t

INNER JOIN [Order Details] od ON t.OrderID = od.OrderID

INNER JOIN Products p ON od.ProductID = p.ProductID

GROUP BY p.ProductNameORDER BY p.ProductNameDROP TABLE #Temp1

这些SQL语句会创建一个临时表,将数据插入该表中,将其他数据与该表进行联接,然后除去该临时表。这会导致此查询进行大量 I/O 操作,因此,可以重新编写查询,使用内嵌视图取代临时表。内嵌视图只是一个可以联接到 FROM 子句中的查询。所以,您不用在 tempdb 中的临时表上耗费大量 I/O 和磁盘访问,而可以使用内嵌视图得到同样的结果:

SELECT p.ProductName,

SUM(od.Quantity) AS ProductQuantityFROM

(SELECT TOP 5 o.OrderID, o.OrderDate

FROM Orders o ORDER BY o.OrderDate DESC ) t

INNER JOIN [Order Details] od ON t.OrderID = od.OrderID

INNER JOIN Products p ON od.ProductID = p.ProductID GROUP BY

p.ProductNameORDER BY p.ProductName

此查询不仅比前面的查询效率更高,而且长度更短。临时表会消耗大量资源。如果只需要将数据联接到其他查询,则可以试试使用内嵌视图,以节省资源。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航