2011-10-17 76 views
1

它應該從ProcessHistory表中的最新記錄的SystemTable和LoadStatus列中返回一些字段。的關係是1對多:這將如何使這個SQL查詢更簡單/更短?

SELECT ST.[SystemDetailID], ST.[SystemName], LH.LatestLoadStatus 
FROM [SystemTable] AS ST 
LEFT OUTER JOIN 
    (
    SELECT LHInner.LoadStatus AS LatestLoadStatus, LHInner.SystemDetailID FROM [dbo].[LoadHistory] AS LHInner 
     WHERE LHInner.LoadHistoryID in 
     (
      SELECT LatestLoadHisotoryID FROM 
      (
       SELECT MAX(LoadHistoryID) as LatestLoadHisotoryID, SystemDetailID FROM [dbo].[LoadHistory] 
       GROUP BY SystemDetailID 
      ) l 
     ) 
    ) AS LH ON ST.SystemDetailID = LH.SystemDetailID 

感謝,

回答

2

這是一個最大的正每組查詢。

一種方法

SELECT ST.[SystemDetailID], 
     ST.[SystemName], 
     LH.LatestLoadStatus 
FROM [SystemTable] AS ST 
     OUTER APPLY (SELECT TOP 1 * 
        FROM [dbo].[LoadHistory] LH 
        WHERE ST.SystemDetailID = LH.SystemDetailID 
        ORDER BY LoadHistoryID DESC) LH 

您還可以使用row_number

WITH LH 
    AS (SELECT *, 
       ROW_NUMBER() OVER (PARTITION BY SystemDetailID 
             ORDER BY LoadHistoryID DESC) RN 
     FROM [dbo].[LoadHistory]) 
SELECT ST.[SystemDetailID], 
     ST.[SystemName], 
     LH.LatestLoadStatus 
FROM [SystemTable] AS ST 
     LEFT JOIN LH 
     ON LH.SystemDetailID = ST.SystemDetailID 
      AND LH.RN = 1 
0
SELECT ST.[SystemDetailID], ST.[SystemName], LH.LatestLoadStatus 
FROM [SystemTable] AS ST 
INNER JOIN [dbo].[LoadHistory] AS LH 
ON ST.SystemDetailID = LH.SystemDetailID 
AND LH.LoadHistoryID IN 
        (SELECT MAX(LoadHistoryID) as LoadHistoryID 
         FROM [dbo].[LoadHistory] 
         GROUP BY SystemDetailID) 
+0

SELECT MAX(LoadHistoryID)作爲LoadHistoryID FROM [DBO] [LoadHistory]是錯誤的。它必須按照SystemDetailID進行分組。 –

+0

對不起,忘了把它加回來.. – StevieG

+0

當你添加它時,你不能再使用「AND LH.LoadHistoryID IN」,因爲內部select語句將返回2列,那麼你必須寫我寫的東西原來。 –