2009-05-19 48 views
0

任何想法,我有兩個表父和子(相關這樣的PK/FK GUID)SQL SELECT WHERE故障很有幫助

的孩子有一個時間戳(記錄創建日期/時間)。

我想要做的是隻獲取最新的子記錄和父記錄,爲每個父記錄。

SELECT 
    dbo_Parents.ParentName, 
    dbo_ChildEntry.CountPropertys, 
    dbo_ChildEntry.DateTimeStamp 
FROM 
    dbo_Parents INNER JOIN dbo_ChildEntry 
ON 
    dbo_Parents.ParentID = dbo_ChildEntry.ParentID 
WHERE 
    ([WHAT SHOULD BE HERE?])) 
+0

您必須定義「最近的」。 – fbinder 2009-05-19 21:36:46

+0

我想僅選擇具有最近datetimestamp的子行(即哪個記錄包含最接近Now()的時間戳) – Nate 2009-05-19 21:38:41

+0

您是否期望每父母有一個結果行,還是總共有一個結果? – Andomar 2009-05-19 21:41:18

回答

8

假設你想要的最新的條目,你必須使用TOP 1和秩序。澄清後

SELECT TOP 1 
dbo_Parents.ParentName, 
dbo_ChildEntry.CountPropertys, 
dbo_ChildEntry.DateTimeStamp 
FROM dbo_Parents 
INNER JOIN dbo_ChildEntry ON dbo_Parents.ParentID = dbo_ChildEntry.ParentID 
ORDER BY dbo_ChildEntry.DateTimeStamp desc 

編輯: 「最近的子記錄與父記錄,爲每個父記錄」:

WHERE dbo_ChildEntry.DateTimeStamp = 
     (Select Max(dbo_ChildEntry.DateTimeStamp) 
       from dbo_ChildEntry 
       where dbo_Parents.ParentID = dbo_ChildEntry.ParentId) 
3
WHERE dbo.ChildEntry.DateTimeStamp = (Select Max(c.DateTimeStamp) 
             from dbo.ChildEntry c 
             where dbo_Parents.ParentID = c.ParentId) 
-1

嘗試

SELECT  dbo_Parents.ParentName,  dbo_ChildEntry.CountPropertys,  
max(dbo_ChildEntry.DateTimeStamp) 
FROM  dbo_Parents 
INNER JOIN dbo_ChildEntry ON dbo_Parents.ParentID = dbo_ChildEntry.ParentID 
group by dbo_Parents.ParentName,  dbo_ChildEntry.CountPropertys 
1
select p.ParentName, 
    c.CountPropertys, 
    c.DateTimeStamp 
from (
    select max(DateTimeStamp) as DateTimeStamp, ParentID 
    from dbo_ChildEntry 
    group by ParentID) cm 
inner join dbo_ChildEntry c on cm.DateTimeStamp = c.DateTimeStamp and cm.ParentID = c.ParentID 
inner join dbo_Parents p on c.ParentID = p.ParentID 
0

由於你澄清你想每個父母一行,試試這個。對於每一行,它都會搜索具有較晚時間戳的子行。在WHERE子句中,它過濾沒有「下一個」子項的行。

SELECT 
    dbo_Parents.ParentName, 
    cur.CountPropertys, 
    cur.DateTimeStamp 
FROM dbo_Parents 
INNER JOIN dbo_ChildEntry cur 
    ON dbo_Parents.ParentID = cur.ParentID 
LEFT JOIN dbo_ChildEntry next 
    ON dbo_Parents.ParentID = next.ParentID 
    AND next.DateTimeStamp > cur.DateTimeStamp 
WHERE 
    next.DateTimeStamp is null