SQL Server: выберите на основе последнего идентификатора в отношении многие к n: m - PullRequest
0 голосов
/ 10 марта 2011

Что мне нужно сделать, это выбрать детали комментария и последнее действие, предпринятое над комментарием; У меня есть 3 таблицы:

Комментарий

CommentID, commentText, userID, date_posted

Действие

ActionID, action_taken,userID,date_actioned

и CommentJoinAction

id,ActionID,CommentID

Может быть один комментарий, но много действий над комментарием.

мой SQL выглядит примерно так:

Select /*snip comment details and such*/
From Comment
Inner Join (select max(actionid) from commentjoinaction) as cja on /*blah cause you know from reading this, it won't work*/

Так что же я могу сделать, чтобы я всегда выбирал последний комментарийДействие для комментариев.

большое спасибо

Ответы [ 4 ]

4 голосов
/ 10 марта 2011
SELECT t.commentText, t.action_taken
    FROM (SELECT c.commentText, a.action_taken,
                 ROW_NUMBER() OVER (PARTITION BY c.CommentID ORDER BY a.date_actioned DESC) AS RowNum
              FROM Comment c
                  INNER JOIN CommentJoinAction cja
                      ON c.CommentID = cja.CommentID
                  INNER JOIN Action a
                      ON cja.ActionID = a.ActionID
          ) t
    WHERE t.RowNum = 1
1 голос
/ 10 марта 2011

Это то, что вы ищете?

SELECT 
/*Select desired fields*/
FROM Comments AS C
    INNER JOIN (
                SELECT 
                    CommentID
                    ,MAX(ActionID) AS ActionID
                FROM CommentJoinAction
                GROUP BY CommentID
            )AS CJA
        ON C.CommentID = CJA.CommentID
        INNER JOIN ACTION AS A
            ON CJA.ActionID = A.ActionID
0 голосов
/ 10 марта 2011

Если вы просто хотите actionID

select c.*, (
  select max(actionID) 
  from CommentJoinAction cja 
  where cja.commentID = c.commentID
) as maxActionID
from Comment c

Или, если вы хотите, чтобы все поля действий:

select c.*, a.*
from Comment c 
inner join Action a 
  on a.actionID =     (
   select max(actionID) 
   from CommentJoinAction 
   where commentID = c.commentID
)
0 голосов
/ 10 марта 2011
select C.*, A.* from Comment C
inner join 
(
    select CommentID, Max(ActionID) as LatestActionID from CommentJoinAction
    group by CommentID
) CJA on C.CommentID = CJA.CommentID
inner join Action A on CJA.LatestActionID = A.ActionID
...