2009-05-19 37 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