Как выбрать только самую последнюю запись в таблице? - PullRequest
0 голосов
/ 17 декабря 2008

У меня есть 3 таблицы базы данных SQLServer.

Project
ProjectID
ProjectName

Thing
ThingID
ThingName

ProjectThingLink
ProjectID
ThingID
CreatedDate

Когда вещь присваивается проекту, запись помещается в таблицу ProjectThingLink. Вещи могут перемещаться между проектами. CreatedDate используется для того, чтобы узнать, какой проект был перемещен в последний раз.

Я пытаюсь создать список всех проектов, с которыми в данный момент связаны Вещи, но мой мозг терпит неудачу.

Есть ли простой способ сделать это?

Ответы [ 5 ]

2 голосов
/ 17 декабря 2008

Это почти всегда даст вам лучшую производительность, чем метод подзапроса. В основном вы ищете строку, в которой нет других строк, а не строку с наибольшей датой:

SELECT
     P.ProjectID,
     P.ProjectName,
     T.ThingID,
     T.ThingName
FROM
     dbo.Projects P
INNER JOIN dbo.ProjectThingLinks PTL1 ON
     PTL1.ProjectID = P.ProjectID
LEFT OUTER JOIN dbo.ProjectThingLinks PTL2 ON
     PTL2.ProjectID = ThingID = PTL1.ThingID AND
     PTL2.CreatedDate > PTL1.CreatedDate
INNER JOIN dbo.Things T ON
     T.ThingID = PTL1.ThingID
WHERE
     PTL2.ThingID IS NULL

Как только вы определились со своими бизнес-правилами для обработки двух строк с одинаковыми значениями CreatedDate, вам может потребоваться настроить запрос.

Кроме того, как примечание, таблица «Вещи», как правило, является хорошим признаком проблемы с дизайном вашей базы данных. Таблицы должны представлять отдельные объекты реальной жизни. Такая общность обычно приводит к проблемам в будущем. Если это ресурсы, то они, вероятно, будут иметь определенные атрибуты, помимо имени. Может быть, ваш случай очень особенный, но, скорее всего, нет. ;)

2 голосов
/ 17 декабря 2008
select p.projectName, t.ThingName
from projects p
join projectThingLink l on l.projectId = p.projectId
join thing t on t.thingId = l.thingId
where l.createdDate =
( select max(l2.createdDate)
  from projectThingLink l2
  where l2.thingId = l.thingId
);

ПРИМЕЧАНИЕ: исправлено после комментария

1 голос
/ 17 декабря 2008

Попробуйте это:

select p.ProjectID, p.Name, t.ThingID, t.ThingName, l.CreatedDate 
from Project p
inner join (
    select ProjectID, max(CreatedDate) as CreatedDate
    from ProjectThingLink
    group by ProjectID
) lm on p.ProjectID = l.ProjectID
inner join ProjectThingLink l on lm.ProjectID = l.ProjectID and lm.CreatedDate = l.CreatedDate
inner joing Thing t on l.ThingID = t.ThingID
0 голосов
/ 17 декабря 2008
select * from project
inner join (select projectid,
                   max(createdate) as maxdate 
            from projectThingLink 
            group by projectid) as a
on projectid = a.projectid  and createDate = a.maxDate
0 голосов
/ 17 декабря 2008

Вы можете просто сделать

SELECT Project.projectId, Project.ProjectName, ThingName
FROM Project  INNER JOIN ProjectThingLink
 ON Project.ProjectID = ProjectThingLink.ProjectID INNER JOIN
                     Thing ON ProjectThingLink.ThingID = Thing.ThingID

Уилл получит список каждого проекта со всеми связанными с ним вещами, например:

1 | Project1 | * То 1006 *

1 | Project1 | ThisThing

2 | Project2 | ThatThing

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...