SQL ВЫБЕРИТЕ, ГДЕ Беда, любые идеи полезны - PullRequest
0 голосов
/ 20 мая 2009

У меня есть две таблицы: родительская и дочерняя (связанные как таковые с PK / FK GUID)

У ребенка есть метка времени (дата / время создания записи).

Что я хочу сделать, так это получить только самую последнюю дочернюю запись И родительскую запись, ДЛЯ КАЖДОЙ родительской записи.

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?]))

Ответы [ 5 ]

8 голосов
/ 20 мая 2009

Предполагая, что вы хотите самую последнюю запись, вы должны использовать 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 голосов
/ 20 мая 2009
WHERE dbo.ChildEntry.DateTimeStamp = ( Select Max( c.DateTimeStamp )
                                         from dbo.ChildEntry c
                                        where dbo_Parents.ParentID = c.ParentId )
1 голос
/ 20 мая 2009
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 голосов
/ 20 мая 2009

Поскольку вы пояснили, что вам нужно по одной строке на каждого родителя, попробуйте это. Для каждой строки выполняется поиск дочерней строки с более поздней отметкой времени. В предложении 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
0 голосов
/ 20 мая 2009

Попробуйте

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...