2010-01-10 12 views
1

J'ai une table: Questionmaster. il stocke DisciplineId, QuestionID, QuestionText etc ...Comment puis-je obtenir des enregistrements de table en pl/sql?

Ma question est la suivante:

J'ai besoin de 10 dossiers de DisciplineId particulier, 20 dossiers pour un autre DisciplineId et 30 dossiers pour someother DisciplineId .... Que dois-je faire pour ça? Comment puis-je associer toutes les déclarations et obtenir seulement 60 (10 + 20 + 30) lignes sélectionnées?

Pour une discipline, il travaille comme indiqué ci-dessous:

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); 

Répondre

2

La requête suivante utilise la fonction analytique RANK() pour trier les questions dans la discipline. La requête externe sélectionne ensuite les dix premières, les vingt premières et les trente premières questions pour les disciplines 1, 2 et 3 respectivement.

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, n'entendiez-vous pas dense_rank()? (Pour les cas improbables de valeurs égales de QuestionNo) :-) – Khb

+0

@khb - en fait, si c'était une possibilité, je choisirais 'row_number()', car je pense que c'est la clé de la solution que nous retournons exactement * 10 * questions pour discipline # 1, * 20 * questions pour la discipline # 2, etc. – APC