1. 程式人生 > >sql語句使用內嵌檢視與臨時表示例

sql語句使用內嵌檢視與臨時表示例

某些時候,查詢需要將資料與其他一些可能只能通過執行 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.OrderDate
FROM Orders o ORDER BY o.OrderDate DESC
SELECT     p.ProductName, SUM(od.Quantity) AS ProductQuantity
FROM     #Temp1 t 
    INNER JOIN [Order Details] od ON t.OrderID = od.OrderID
    INNER JOIN Products p ON od.ProductID = p.ProductID 
GROUP BY p.ProductName
ORDER BY p.ProductName
DROP TABLE #Temp1

這些 SQL 語句會建立一個臨時表,將資料插入該表中,將其他資料與該表進行聯接,然後除去該臨時表。這會導致此查詢進行大量 I/O 操作,因此,可以重新編寫查詢,使用內嵌檢視取代臨時表。內嵌檢視只是一個可以聯接到 FROM 子句中的查詢。所以,您不用在 tempdb 中的臨時表上耗費大量 I/O 和磁碟訪問,而可以使用內嵌檢視得到同樣的結果:

SELECT p.ProductName, 
    SUM(od.Quantity) AS ProductQuantity
FROM     (
    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.ProductName
ORDER BY
    p.ProductName

此查詢不僅比前面的查詢效率更高,而且長度更短。臨時表會消耗大量資源。如果只需要將資料聯接到其他查詢,則可以試試使用內嵌檢視,以節省資源。