Sql - возвращение номеров строк - PullRequest
2 голосов
/ 06 августа 2011

У меня запрос к двум таблицам. Дочерняя таблица соответствует родительской таблице.

Другими словами, в родительской таблице 6 записей.

Для каждой из этих 6 записей существует внешний ключ, который возвращает тысячи записей.

Мне нужно вернуть первые 25 записей для КАЖДОГО из 6 записей.

Я могу вернуть первые 150 записей, но не по их идентификатору.

select * from table where rownum <150

Но это, очевидно, не возвращает первые 25 записей для КАЖДОГО.

Любая помощь будет принята с благодарностью. Спасибо.

Ответы [ 4 ]

3 голосов
/ 06 августа 2011

Предполагается, что СУБД, поддерживающая оконные функции:

SELECT q.parent_column_a, q.child_column_b
    FROM (SELECT p.column_a AS parent_column_a, c.column_b AS child_column_b,
                 ROW_NUMBER() OVER(PARTITION BY p.primarykey ORDER BY c.primarykey) AS RowNum
              FROM parent p
                  INNER JOIN child c
                      ON p.primarykey = c.foreignkey) q
    WHERE q.RowNum <= 25
1 голос
/ 06 августа 2011

Если вы используете SQL Server или Oracle, это решение.

select * from
(
    select p.parent_id, c.child_id, 
    row_number() over (partition by c.parent_id order by c.child_id) rn
    from parent p inner join child c on p.parent_id = c.parent_id
) subsel
where rn <= 25
0 голосов
/ 06 августа 2011

Это работает на моих данных

Объяснение

По сути, вы используете предложение WHERE для выбора только тех строк, в которых идентификатор дочерней таблицы находится в верхних 25 из всех строк дочерней таблицы, которые соответствуют ее родителю.

Запрос

SELECT * -- Column List
FROM ParentTable
    INNER JOIN SubTable
WHERE SubTable.ID IN 
    (SELECT TOP 25 SubTable.ID 
     FROM SubTable s2 
     WHERE s2.ParentTableID = SubTable.ParentTableID)

Это должно работать практически на любой базе данных sql.

0 голосов
/ 06 августа 2011
SELECT TOP 25 SubEntries.SubEntryID
FROM Entries Entries
INNER JOIN SubEntries SubEntries
   ON Entries.EntryID = SubEntries.EntryID
...