【问题标题】:subquery for getting top 3 rownum not work in pl/sql用于获取前 3 个 rownum 的子查询在 pl/sql 中不起作用
【发布时间】:2013-11-27 16:22:15
【问题描述】:
DECLARE
    CURSOR EMPCUR 
      SELECT EMPNO,ENAME,SAL,ROWNUM 
        FROM (SELECT * 
                FROM EMP 
               ORDER BY SAL DESC) 
       WHERE ROWNUM<=3 
       ORDER BY ROWNUM;
BEGIN
  FOR EMPREC IN EMPCUR
  LOOP
    DBMS_OUTPUT.PUT_LINE('RANK '||EMPREC.ROWNUM);
    DBMS_OUTPUT.PUT_LINE(EMPREC.EMONO||' - '||EMPREC.ENAME||' - '||EMPREC.SAL);
  END LOOP;
END;
/

此代码不起作用:

第 2 行出现错误:ORA-06550:第 2 行,第 17 列:PLS-00103:遇到 预期以下之一时的符号“SELECT”:(;是返回 符号“is”被替换为“SELECT”以继续。

【问题讨论】:

  • 您在 EMPCUR 游标声明中遗漏了 IS 关键字。而且,在这种特殊情况下确实没有必要使用ORDER BY ROWNUM

标签: sql oracle plsql subquery rownum


【解决方案1】:

您在游标声明中遗漏了IS,并且在第7 行EMPREC.EMONO 中有错字。

这样试试,

DECLARE
    CURSOR EMPCUR IS  SELECT EMPNO,ENAME,SAL,ROWNUM FROM (SELECT * FROM EMP ORDER BY SAL DESC) WHERE ROWNUM<=3 ORDER BY ROWNUM;
BEGIN
    FOR EMPREC IN EMPCUR
    LOOP
        DBMS_OUTPUT.PUT_LINE('RANK '||EMPREC.ROWNUM);
        DBMS_OUTPUT.PUT_LINE(EMPREC.EMPNO||' - '||EMPREC.ENAME||' - '||EMPREC.SAL);
    END LOOP;
END;
/

【讨论】:

    【解决方案2】:

    我想建议在子查询中使用 rownum 伪列对事物进行排名充其量是一种有缺陷的方法,很少能达到实际目标。例如,您想要薪水前三名的员工吗?或者您总是想要最多三个记录?这个等式如何处理工资相同的员工?等等。

    使用分析函数、在这些函数中定义明确的排名并返回实际回答问题的结果是一种更好的方法。

    begin
        for rec in ( select sq.*
                       from ( select e.employee_id
                                   , e.first_name ||' '|| e.last_name as full_name 
                                   , e.salary
                                   , rank() over (order by e.salary desc) as salary_rank
                                from hr.employees e ) sq
                      where sq.salary_rank <= 3
                      order by sq.salary desc )
        loop
            dbms_output.put_line('RANK ' || rec.salary_rank);
            dbms_output.put_line(rec.employee_id || ' - ' || rec.full_name || ' - ' || rec.salary);
        end loop;
    end;
    

    【讨论】:

      猜你喜欢
      • 2012-04-26
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      • 2016-10-26
      • 1970-01-01
      • 2015-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多