jobposition表                   jobinfo表
      id  pid     name            needmajorids
      22   -1    营销学             -1
      23   22    营销管理专业       22
      24   22    营销xxx专业        23
      25   22    营销xxxx专业       26
      26   -1    农业类             28
      27   26    农学               27
      28   26    园艺               -1如果needmajorids 是22  则存的是id 为22的值;如果needmajorids 是23  则存的虽是id 为23的值,但我要根据根据id(23) 存其对应的pid(22)的值 ;如果needmajorids 是27  则存的虽是id 为27的值,但我要根据根据id(27) 存其对应的pid(26)的值 等,如果这样的话:此时以pid排序为  22,22,26 .最后去掉重复的取前十位!例如:专业为22,22,26,27,28,28,29,30,31,32,33,35,36 ,排序取前十位后为22,26,27,28,29,30,31,32,33,35
我现在写了一部分感觉,不知对不对:
String SELECT="select * from (select pid,num,rownum qbcRownum from (select pid , count(id) num from MajorInfo  where pid in  (select needmajorids from jobinfo where needmajorids!=-1 and isenable=1 and CompanyId in (select id from CompanyMember where CompMemLevelId!=1 and CompMemLevelId!=100  and MemEndDate>sysdate and isenable=1) ) group by pid order by num desc) ) where qbcRownum>0 and qbcRownum<11 order by num desc ";帮帮忙,谢谢了,急!!!

解决方案 »

  1.   

    MajorInfo表                        
           id  pid     name                 
          22   -1    营销学             
          23   22    营销管理专业       
          24   22    营销xxx专业        
          25   22    营销xxxx专业       
          26   -1    农业类             
          27   26    农学               
          28   26    园艺                jobinfo表
     needmajorids-1
    22
    23
    26
    28
    27
    -1
    MajorInfo表中的id就是jobinfo表下needmajorids的值
      

  2.   

    想要得到什么结果?
    可以先得到MajorInfo父子关系,然后根据得到的父子关系查询jobinfo对应想要的值
      

  3.   


    我也没看懂你要什么数据,不过你只是要分析函数,我给你写个看下,你看能不能参考,你不是要专业前十名嘛,要并列的嘛?我那个班级前十名做下对比吧。学生表和学生成绩表。
    学生表(student): 学生编号(STU_ID)  学生名称(STU_NAME)
    学生成绩表(student_score_info):学生编号(STU_ID) 班级编号(CLASS_ID) 学生成绩(STU_SCORE)情况1:如果并列,不算,只管去除前十名人员,不管并列现象。
    SELECT stu_id,stu_name,class_id FROM(
      SELECT t1.stu_id,t1.stu_name,t2.class_id,row_number() over(
        PARTITION BY t2.class_id ORDER BY t2.stu_score DESC/*按照班级分组,成绩降序排序,得到顺序号,不论是否同名,分组内部每行增加1*/
      ) RN
      FROM student t1,student_score_info t2
      WHERE t1.stu_id = t2.stu_id)
    WHERE RN < 11;情况2:如果并列,也同样计算出来,比如很多分数相同的,这些人都算是前十名。
    SELECT stu_id,stu_name,class_id FROM(
      SELECT t1.stu_id,t1.stu_name,t2.class_id,dense_rank() over(
        PARTITION BY t2.class_id ORDER BY t2.stu_score DESC/*按照班级分组,成绩降序排序,得到顺序号,同stu_score时生成序号一样,分组内部下一个stu_score增加1*/
      ) RN
      FROM student t1,student_score_info t2
      WHERE t1.stu_id = t2.stu_id)
    WHERE RN < 11;情况3:这种很少使用,并列计算,但是需要跳跃下标编号,这样提取出来的前几名不好说,一般用于全量导出数据给查看排名比较多,因为排名完全是正规排名方式,而且并列的名次是编号是一样的,但是要去除前十,考虑并列的情况就不好说是什么数据了:
    SELECT stu_id,stu_name,class_id FROM(
      SELECT t1.stu_id,t1.stu_name,t2.class_id,rank() over(
        PARTITION BY t2.class_id ORDER BY t2.stu_score DESC/*按照班级分组,成绩降序排序,得到顺序号,同stu_score时生成序号一样,遇到下一个stu_score序号增加的数量为前一个stu_score的数据行数*/
      ) RN
      FROM student t1,student_score_info t2
      WHERE t1.stu_id = t2.stu_id)
    WHERE RN < 11;
      

  4.   

    顶一下
       oracle QQ群:54775466
               期待您的一起探讨
                          欢迎爱好者入群学习
      

  5.   

    使用row_number ,使用方法可网络查询一下。
      

  6.   

    SQL> select deptno,ename,sal from emp order by deptno,sal desc;    DEPTNO ENAME             SAL
    ---------- ---------- ----------
            10 KING             5000
            10 CLARK            2450
            10 MILLER           1300
            20 SCOTT            3000
            20 FORD             3000
            20 JONES            2975
            20 ADAMS            1100
            20 SMITH             800
            30 BLAKE            2850
            30 ALLEN            1600
            30 TURNER           1500    DEPTNO ENAME             SAL
    ---------- ---------- ----------
            30 MARTIN           1250
            30 WARD             1250
            30 JAMES             950已选择14行。SQL> break on deptno skip 1
    SQL> select deptno,ename,sal from emp order by deptno,sal desc;    DEPTNO ENAME             SAL
    ---------- ---------- ----------
            10 KING             5000
               CLARK            2450
               MILLER           1300        20 SCOTT            3000
               FORD             3000
               JONES            2975
               ADAMS            1100
               SMITH             800        30 BLAKE            2850    DEPTNO ENAME             SAL
    ---------- ---------- ----------
            30 ALLEN            1600
               TURNER           1500
               MARTIN           1250
               WARD             1250
               JAMES             950
    已选择14行。SQL> break on ''
    SQL>
    --查出各部门薪水前三名的员工姓名、薪水。
    SQL> select * from(
      2  select deptno,rank() over(partition by deptno order by sal desc) rk,ename,sal
      3  from emp
      4  )
      5  where rk<=3
      6  /    DEPTNO         RK ENAME             SAL
    ---------- ---------- ---------- ----------
            10          1 KING             5000
            10          2 CLARK            2450
            10          3 MILLER           1300
            20          1 SCOTT            3000
            20          1 FORD             3000
            20          3 JONES            2975
            30          1 BLAKE            2850
            30          2 ALLEN            1600
            30          3 TURNER           1500已选择9行。SQL> select * from(
      2  select deptno,dense_rank() over(partition by deptno order by sal desc) drk,ename,sal
      3  from emp
      4  )
      5  where drk<=3
      6  /    DEPTNO        DRK ENAME             SAL
    ---------- ---------- ---------- ----------
            10          1 KING             5000
            10          2 CLARK            2450
            10          3 MILLER           1300
            20          1 SCOTT            3000
            20          1 FORD             3000
            20          2 JONES            2975
            20          3 ADAMS            1100
            30          1 BLAKE            2850
            30          2 ALLEN            1600
            30          3 TURNER           1500已选择10行。SQL>