TSQL оставила соединение, и только продержитесь строку от права

Я пишу запрос SQL для получения сообщения и только последнего комментария этого сообщения (если существует). Но я не могу найти способ ограничить только 1 строку для правого столбца в левом соединении.

Вот образец этого запроса.

SELECT post.id, post.title,comment.id,comment.message
from post
left outer join comment
on post.id=comment.post_id

Если сообщение имеет 3 комментария, я получаю 3 строки с этим сообщением, но я хочу только 1 строку с последним комментарием (заказанный по дате).

Кто-то может помочь мне с этим запросом?

31
задан barbarian 17 February 2010 в 14:44
поделиться

5 ответов

SELECT  post.id, post.title, comment.id, comment.message
FROM    post
OUTER APPLY
        (
        SELECT  TOP 1 *
        FROM    comment с
        WHERE   c.post_id = post.id
        ORDER BY
                date DESC
        ) comment

или

SELECT  *
FROM    (
        SELECT  post.id, post.title, comment.id, comment.message,
                ROW_NUMBER() OVER (PARTITION BY post.id ORDER BY comment.date DESC) AS rn
        FROM    post
        LEFT JOIN
                comment
        ON      comment.post_id = post.id
        ) q
WHERE   rn = 1

Первый более эффективен для небольшого количества сообщений с большим количеством комментариев в каждом; последний более эффективен для многих сообщений с небольшим количеством комментариев в каждом.

52
ответ дан 27 November 2019 в 21:53
поделиться

Пара вариантов ....

Один из способов - выполнить СОЕДИНЕНИЕ на:

SELECT TOP 1 comment.message FROM comment ORDER BY comment.id DESC

(обратите внимание, я предполагаю, что comment.id это поле идентификации)

1
ответ дан 27 November 2019 в 21:53
поделиться

Подзапрос:

SELECT p.id, p.title, c.id, c.message
FROM post p
LEFT join comment c
ON c.post_id = p.id AND c.id = 
                 (SELECT MAX(c.id) FROM comment c2 WHERE c2.post_id = p.id)
15
ответ дан 27 November 2019 в 21:53
поделиться

. Вы захотите присоединиться к подзапросу, который возвращает последний комментарий к публикации. Например:

select post.id, post.title. lastpostid, lastcommentmessage
from post
inner join
(
    select post.id as lastpostid, max(comment.id) as lastcommentmessage
    from post
    inner join comment on commment.post_id = post.id
    group by post.id
) lastcomment
    on lastpostid = post.id
3
ответ дан 27 November 2019 в 21:53
поделиться

какая версия SQL Server? Если у вас есть функция Row_Number(), вы можете отсортировать свои комментарии по любому значению "первый" для вас, а затем просто добавить предложение "where RN=1". У меня нет удобного примера или правильного синтаксиса, но есть тонны запросов, которые делают именно это. В других постах есть 1000 способов, как это можно сделать.

Я бы сказал, профилируйте их и посмотрите, какой из них работает лучше для вас.

1
ответ дан 27 November 2019 в 21:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: