SQL SELECT Onde problemas alguma idéia útil

votos
0

Eu tenho duas tabelas pai e filho (relacionado como tal no PK / FK GUID)

Criança tem um Timestamp (a criação do registro de data / hora).

O que eu quero fazer é obter apenas o mais recente registro filho E o registro pai, para cada registro pai.

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?]))
Publicado 19/05/2009 em 22:34
fonte usuário
Em outras línguas...                            


5 respostas

votos
8

Supondo que você deseja que a entrada mais recente, você tem que usar TOP 1 e ordem por.

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

Edite após esclarecimento: "o mais recente registro filho E o registro pai, para cada registro pai":

WHERE dbo_ChildEntry.DateTimeStamp = 
      ( Select Max( dbo_ChildEntry.DateTimeStamp )
               from dbo_ChildEntry 
               where dbo_Parents.ParentID = dbo_ChildEntry.ParentId )
Respondeu 19/05/2009 em 22:37
fonte usuário

votos
3
WHERE dbo.ChildEntry.DateTimeStamp = ( Select Max( c.DateTimeStamp )
                                         from dbo.ChildEntry c
                                        where dbo_Parents.ParentID = c.ParentId )
Respondeu 19/05/2009 em 22:41
fonte usuário

votos
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
Respondeu 19/05/2009 em 22:42
fonte usuário

votos
0

Desde que você esclareceu que gostaria uma linha por pais, tente isso. Para cada linha, ele procura uma linha filha que tem um timestamp mais tarde. Na cláusula WHERE, que filtra em linhas que não têm uma "próxima" da criança.

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
Respondeu 19/05/2009 em 23:00
fonte usuário

votos
-1

Experimentar

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
Respondeu 19/05/2009 em 22:42
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more