2011-01-12 3 views
1

У меня есть две таблицы, которые я внешняя соединяю вместе: «Опубликовать» левое внешнее соединение с помощью «Комментарии».Ограничить количество записей во внешнем соединении на основе левого стола

Существует связь «один ко многим» между Почтой и комментариями.

Я хочу, чтобы иметь возможность вытащить первые, скажем 10, записи Записи и все связанные Комментарии (если есть) для каждой Почты.

Способ, которым я обычно делал это, состоял бы в том, чтобы иметь общее выражение таблицы и использовать ROW_NUMBER() OVER. Однако ROW_NUMBER() подсчитывает каждую строку, которая в этом случае не будет работать, поскольку я хочу только подсчитать записи Post.

Я смотрел ROW_NUMBER() OVER (PARTITION), но это не работает, как я ожидал бы этого.

Так что, если хотите, первые 5 сообщений, я хотел бы получить что-то вроде:

PostNumber  PostId  CommentId 
1    1   1 
1    1   2 
2    2   - 
3    8   3 
3    8   4 
4    9   5 
5    15   - 
+0

Вы хотите десять записей сообщения с комментариями, где может быть 1+? Поэтому, если запись POSTS № 1 содержит более 100 комментариев ... –

ответ

1

Посмотрите, используя DENSE_RANK функцию

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

Что-то вроде

;WITH Vals AS (
     SELECT p.*, 
       DENSE_RANK() OVER(ORDER BY p.PostID) DenseRankID 
     FROM Post p LEFT JOIN 
       Comments c ON p.PostID = c.PostID 
) 
SELECT * 
FROM Vals 
WHERE DenseRankID <= 10 
Смежные вопросы