2010-01-10 1 views
1

У меня есть один стол: вопросник. он хранит DisciplineId, QuestionID, QuestionText и т.д ...Как получить записи из таблицы в pl/sql?

Теперь мой вопрос:

мне нужно 10 записей конкретного DisciplineId, 20 записей для другого DisciplineId и 30 записей для Someother DisciplineId .... Что я должен для чего? Как я могу включить все заявление и получить только 60 (10 + 20 + 30) строк?

Для одной дисциплины, она работает, как показано ниже:

create or replace function fun_trial(Discipline1,Disc1_NoOfQuestions) 
open cur_out for 
    select getguid() tmp, 
    QuestionNo,QuestionText, 
    Option1,Option2, 
    Option3,Option4, 
    Correctanswer,Disciplineid 
    from Questionmaster 
    where DisciplineId=discipline1 
    AND rownum <= disc1_NoOfQuestions 
    order by tmp ; 
return (cur_out); 

ответ

2

Следующий запрос использует аналитическую функцию RANK() сортировать вопросы в рамках дисциплины. Внешний запрос затем выбирает первые десять, первые двадцать и первые тридцать вопросов для дисциплин 1, 2 и 3 соответственно.

select * from (
  select getguid() tmp 
     , QuestionNo 
     , QuestionText 
     , Option1 
     , Option2 
     , Option3 
     , Option4 
     , Correctanswer 
     , Disciplineid 
     , rank() over (partition by Disciplineid order by QuestionNo) as rn 
  from  Questionmaster 
  where DisciplineId in (1, 2, 3) 
) 
where (DisciplineId = 1 and rn <= 10) 
or (DisciplineId = 2 and rn <= 20) 
or (DisciplineId = 3 and rn <= 30) 
/
+0

@APC: Nitpick, разве вы не имели в виду dense_rank()? (Для маловероятных случаев равных значений QuestionNo) :-) – Khb

+0

@khb - на самом деле, если бы это была возможность, я бы выбрал 'row_number()', так как я думаю, что это ключ к решению, мы возвращаем точно * 10 * вопросов для дисциплина № 1, * 20 * вопросы для дисциплины № 2 и т. д. – APC