2011-03-06 115 views
4

我有以下表/列:子孩子選擇最近的記錄

Parent: 
    ParentID 

Child: 
    ChildID 
    ParentID 

SubChild: 
    SubChildID 
    ChildID 
    Date 

Parent有1與Child

Child有1一對多的關係,以一對多的關係與SubChild

對於每Parent,我需要得到SubChild與最新的Date值。 我該如何使用SQL來做到這一點。我試過使用MAX(Date), ,但我似乎無法弄清楚如何成功加入ParentChild

理想的結果集將包含所有Parent s加入所有最新記錄的SubChild列。

注意:在使用MS SQL 2005+

回答

3

看一看使用ROW_NUMBER

喜歡的東西

;WITH Vals AS (
     SELECT p.ParentID, 
       sc.SubChildID, 
       ROW_NUMBER() OVER (PARTITION BY p.ParentID ORDER BY sc.[Date] DESC) RowID 
     FROM Parent p INNER JOIN 
       Child c ON p.ParentID = c.ParentID INNER JOIN 
       SubChild sc ON c.ChildID = sc.ChildID 
) 
SELECT ParentID, 
     SubChildID 
FROM Vals 
WHERE RowID = 1 
0

爲此,您可以使用相關子查詢,但它是更快地使用SQL Server 2005 ranking functions。只要你知道你在做什麼,就是這樣。

2

對於一些數據分佈這種方法可能會更快。

SELECT p.ParentID, 
     sc.SubChildID, 
     sc.Date 
FROM Parent p 
     CROSS APPLY (SELECT TOP(1) s.SubChildID, 
            s.Date 
        FROM SubChild s 
          JOIN Child c 
          ON c.ChildID = s.ChildID 
        WHERE c.ParentID=p.ParentID 
        ORDER BY s.Date DESC) sc 
0

爲了簡單起見,您可以做一個子選擇。在我的測試這種具有相同的性能作爲「跨應用」的方法:

select firstname, lastname, 
(Select top 1 Display from _notes where _notes.ParentId = c.Id order by createdon desc) as MostRecentNote 
from _contacts c 

對於47K的記錄,這種「分選」的方法大約需要4秒。爲了使速度更快,我在_Notes上添加了一個排序索引,其中包括ParentId,CreatedOn(降序排列)和顯示列被包括在內)。這將47k記錄中的查詢時間降低到1秒以內。