выбор последних строк для каждого отдельного значения внешнего ключа - PullRequest
7 голосов
/ 18 января 2010

простите за название, я не смог придумать что-то короткое и конкретное ...

У меня есть таблица «обновлений» с тремя столбцами: text, typeid, созданный - text - текстовое поле, typeid - внешний ключ из таблицы «type» и созданная временная метка Пользователь вводит обновление и выбирает «тип», которому оно соответствует.

Существует соответствующая таблица типов с столбцами id и name.

Я пытаюсь получить набор результатов, содержащий столько строк, сколько есть в таблице 'type', и последнее значение из updates.text для конкретной строки в типах. Поэтому, если у меня есть 3 типа, будет возвращено 3 строки, по одной строке для каждого типа и самое последнее значение updates.text для рассматриваемого типа.

Есть идеи?

спасибо,

Джон.

Ответы [ 3 ]

14 голосов
/ 18 января 2010
select u.text, u.typeid, u.created, t.name
from  (
    select typeid, max(created) as MaxCreated
    from updates
    group by typeid
) mu
inner join updates u on mu.typeid = u.typeid and mu.MaxCreated = u.Created
left outer join type t on u.typeid = t.typeid
0 голосов
/ 18 января 2010
SELECT
     TYP.id,
     TYP.name,
     TXT.comment
FROM
     dbo.Types TYP
INNER JOIN dbo.Type_Comments TXT ON
     TXT.type_id = TYP.id
WHERE
     NOT EXISTS
     (
          SELECT
               *
          FROM
               dbo.Type_Comments TXT2
          WHERE
               TXT2.type_id = TYP.id AND
               TXT2.created > TXT.created
     )

Или:

SELECT
     TYP.id,
     TYP.name,
     TXT.comment
FROM
     dbo.Types TYP
INNER JOIN dbo.Type_Comments TXT ON
     TXT.type_id = TYP.id
LEFT OUTER JOIN dbo.Type_Comments TXT2 ON
     TXT2.type_id = TYP.id AND
     TXT2.created > TXT.created
WHERE
     TXT2.type_id IS NULL

В любом случае, если дата создания может быть одинаковой для двух строк с одинаковым type_id, вам придется учитывать это.

Я также предположил, что существует по крайней мере один комментарий для каждого типа.Если это не так, то вам также необходимо внести небольшую корректировку.

0 голосов
/ 18 января 2010

Какие столбцы вы хотите вернуть?

SELECT t.*,
       y.*
  FROM TYPE t
  JOIN (SELECT u.typeid,
               MAX(u.created) 'max_created'
          FROM UPDATES u
      GROUP BY u.typeid) x ON x.typeid = t.id
  JOIN UPDATES y ON y.typeid = x.typeid
                AND y.created = x.max_created
...