Oracle Pl / sql возвращает один курсор из нескольких запросов - PullRequest
1 голос
/ 27 ноября 2010

У меня есть хранимая процедура, которая возвращает курсор.

Приложение передает в процедуру параметр, который определяет, сколько идентификаторов нужно выбрать, поэтому процедура не знает ни секунды этого числа.

foreach ID Мне нужно получить 3 верхние записи с этим ID. то, что я пробовал, использует:

select * from table_name where id in (List of ID`s);

Этот запрос работает, но я не могу получить верхние 3 каждого идентификатора. Если я ограничу количество результатов, я получу ТОП-результаты первого идентификатора.

Я подумал использовать For Loop, выполнить запрос для каждого идентификатора и добавить результаты к курсору, но, насколько я понимаю, это невозможно.

Есть идеи?

Подробнее Допустим, у меня есть 5 ID s and each of them have inner Id с, так Id 1 имеет (1,2,3,4,5) Id 2 (1,2,3,4,5) Id 3 (12,14,15,16,22) Id 4 (2,3,5,7) , 9) Id 5 (4,7,8,9,10) В этом случае, с которым я имею дело, я не вижу, как мне поможет номер строки. Мне нужны первые 3 для каждого идентификатора, в этом случае курсор должен иметь 15 результатов.

10х много и хороших выходных;)

Ответы [ 2 ]

5 голосов
/ 27 ноября 2010

Предположительно, у вас есть какой-то критерий для определения первых трех?

В любом случае, для достижения этой цели можно использовать аналитическую функцию.Oracle предлагает три различные функции: ROW_NUMBER (), RANK () и DENSE_RANK ().Они предлагают три немного разные интерпретации TOP 3. Узнать больше .

Вот основная идея, использующая ROW_NUMBER (), которая будет возвращать ровно три строки для каждого идентификатора.

open rc for 
    select * from (
        select t.*
               , row_number() over (partition by id order by whatever ) rn 
        from table_name t 
        where t.id in (List of ID`s)
     )
     where rn <= 3;

whatever в предложении ROW_NUMBER () - это столбец, который вы используете для определения TOP-ness.

0 голосов
/ 27 ноября 2010

Еще одна идея - определить временную таблицу Oracle

create global temporary table temp_table_name

Ссылка на дополнительную информацию

Затем в цикле for вы можете вставить строки во временную таблицу для всех необходимых идентификаторов. Возвращенный курсор будет тогда содержимым временной таблицы. Конечно, это решение имеет смысл только тогда, когда невозможно получить результат из одного SQL-запроса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...