SELECT MAX(DECODE(C.RN,'1',C.NAME,NULL))||
       MAX(DECODE(C.RN,'2',','||C.NAME,NULL))||
       MAX(DECODE(C.RN,'3',','||C.NAME,NULL)) NAME
       FROM
       (SELECT A.SC,B.NAME,B.ID,B.AGE,
               ROW_NUMBER() OVER(PARTITION BY B.ID ORDER BY B.ID) RN
       FROM A,B
       WHERE A.ID=B.ID) C;
运行的结果有时报错,原本MAX(C.RN)=1的,也会有两个NAME被合并。
但加上ROWNUM问题就解决了,如下:
SELECT MAX(DECODE(C.RN,'1',C.NAME,NULL))||
       MAX(DECODE(C.RN,'2',','||C.NAME,NULL))||
       MAX(DECODE(C.RN,'3',','||C.NAME,NULL)) NAME
       FROM
       (SELECT A.SC,B.NAME,B.ID,B.AGE,
               ROWNUM,
               ROW_NUMBER() OVER(PARTITION BY B.ID ORDER BY B.ID) RN
       FROM A,B
       WHERE A.ID=B.ID) C;
    我想知道是什么原因报错的,解决了又是问什么。
    先谢了。

解决方案 »

  1.   

    不清楚樓主的錯誤原因,我下面的例子找出每個部門工資最高的員工,子查詢中用到了row_number,但沒有報錯。select *
    from (
    select e.employee_id, d.department_name,
    row_number() over (partition by e.department_id order by e.salary desc) rn
    from employees e, departments d
    where e.department_id = d.department_id
    ) t
    where rn = 1;
      

  2.   

    不好意思,补充下,是跟‘用MAX()合并列为字符串’一起用才会报错的。
      

  3.   

    也沒問題呀,每個部門的工資top3select MAX(DECODE(t.RN,'1',t.employee_id,NULL))||
           MAX(DECODE(t.RN,'2',','||t.employee_id,NULL))||
           MAX(DECODE(t.RN,'3',','||t.employee_id,NULL)) top3
    from (
    select e.employee_id, d.department_name,
    row_number() over (partition by e.department_id order by e.salary desc) rn
    from employees e, departments d
    where e.department_id = d.department_id
    ) t
    group by t.department_name;樓主,把你的表創建語句和數據insert語句貼出研究一下吧。
      

  4.   

    我也是在几个表里用max才遇到一个,即使是没有数据也会出现一条合并信息。 
    就是想知道下,多加的ROWNUM在这里起了什么样的作用。
      

  5.   

    得到的数据是错误的,原本MAX(C.RN)=1的,也会有两个NAME被合。
     
    单独执行SELECT MAX(C.RN) FROM C;当从C中RN=1时,MAX(C.RN)=2。
    就是这样。