簡體   English   中英

帶有子查詢的SQL查詢優化

[英]SQL Query Optimization with SubQueries

有人可以幫我優化/重寫此查詢嗎? 我想我違反了這件事中的一些規定。

SELECT
    p.PropertyTagNumber, 
    Last_Inv_Hist.Plant, 
    Last_Inv_Hist.Location,
    (
        SELECT     TOP (1) comment_txt
        FROM          Comment
        WHERE      (property_id = p.ID)
        ORDER BY id DESC
    ) AS Remarks

FROM    Property AS p 
LEFT OUTER JOIN
(
    SELECT     i.ID, i.PropertyID,  i.Location, pl.Plant
    FROM InventoryHistory AS i LEFT OUTER JOIN
    Plants AS pl ON i.PlantID = pl.ID
    WHERE   (i.ID = (   SELECT     TOP (1) ID AS max_id
                FROM          InventoryHistory
                WHERE      (PropertyID = i.PropertyID)
                ORDER BY InventoryDate DESC
            )
        )
) AS Last_Inv_Hist 
    ON p.ID = Last_Inv_Hist.PropertyID

這是我會做的

WITH inv AS
(
   SELECT ID, PropertyID,  Location, pl.Plant,
          ROW_NUMBER() OVER (PARTITION BY ID ORDER BY InventoryDate DESC) as DateOrder
   FROM InventoryHistory
), MaxInv AS
( SELECT ID, PropertyID,  Location, Plant
  FROM inv 
  WHERE DateOrder = 1
), MaxComment AS
(
  SELECT comment_txt, property_id
  FROM (
    SELECT comment_txt, property_id,
           ROW_NUMBER() OVER (PARTITION BY property_id ORDER BY ID DESC) AS IdOrder
    FROM   Comment
  ) X
  WHERE IdOrder = 1
)
SELECT
  p.PropertyTagNumber, 
  MaxInv.Plant, 
  MaxInv.Location,
  MaxComment.Comment_txt
FROM Property AS p 
LEFT JOIN MaxComment On p.ID = MaxComment.propertyID
LEFT JOIN MaxInv ON ON p.ID = MaxInv.PropertyID

一些注意事項-

  • 通過將查找給定列最大值的代碼放入CTE中(或者您可以使用子查詢,我認為CTE更容易閱讀),您只需執行一次選擇-在您的代碼中進行選擇每行(除非您的產品足夠智能以進行優化)。

  • 我向您展示了兩種有目的地進行CTE的方法-有些可能會喜歡一種方法。

  • 我發現評論選擇非常奇怪-為什么使用ID來決定顯示哪個?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM