누군가이 쿼리를 최적화 / 다시 작성하도록 도와 주시겠습니까? 나는 내가 몇 가지해야 할 일을 위반했다고 생각하고 이것에 있지 않습니다.
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를 사용하여 표시 할 항목을 결정하는 이유는 무엇입니까?
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다