У меня есть 2 столбца в отношении один ко многим.Я хочу отсортировать по «многим» и вернуть первое вхождение «одного».Мне нужно пролистать данные, поэтому, например, мне нужно иметь возможность получить 3-ю группу из 10 уникальных значений "one".
У меня такой запрос:
SELECT id, name
FROM table1
INNER JOIN table2 ON table2.fkid = table1.id
ORDER BY name, id;
В таблице2 может быть несколько строк для каждой строки в таблице1.
Результаты моего запроса выглядят так:
id | name
----------------
2 | apple
23 | banana
77 | cranberry
23 | dark chocolate
8 | egg
2 | yak
19 | zebra
Мне нужно пролистать набор результатов, чтобы каждая страница содержала n уникальных идентификаторов.Например, если start = 1 и n = 4, я хочу получить обратно
2
23
77
8
в том порядке, в котором они были отсортированы (т. Е. По имени), где id возвращается в позиции его первого вхождения.Точно так же, если start = 3 и n = 4 и order = desc, я хочу
8
23
77
2
Я попробовал это:
SELECT * FROM (
SELECT id, ROWNUM rnum FROM (
SELECT DISTINCT id FROM (
SELECT id, name
FROM table1
INNER JOIN table2 ON table2.fkid = table1.id
ORDER BY name, id)
WHERE ROWNUM <= 4)
WHERE rnum >=1)
, который дал мне идентификаторы в числовом порядке, а не в порядкекак имена будут.
Я также попытался:
SELECT * FROM (
SELECT DISTINCT id, ROWNUM rnum FROM (
SELECT id FROM (
SELECT id, name
FROM table1
INNER JOIN table2 ON table2.fkid = table1.id
ORDER BY name, id)
WHERE ROWNUM <= 4)
WHERE rnum >=1)
, но это дало мне повторяющиеся значения.
Как я могу просмотреть результаты этих данных?Мне просто нужны идентификаторы, ничего из таблицы «многие».
update
Полагаю, я все ближе с изменением внутреннего запроса на
SELECT id, name, rank() over (order by name, id)
FROM table1
INNER JOIN table2 ON table2.fkid = table1.id
... но я все еще получаю дубликаты идентификаторов.