[英]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.