ListAgg()ORA-01002:不按顺序取出

时间:2016-03-23 17:47:51

标签: oracle

我正在运行查询,我不想在GROUP BY子句中包含GL列,因为我不想为GL字段的每个变体显示不同的行。但我需要在后续处理中评估该字段,将其与动态生成的GL编号列表进行比较。我能想到的最好方法是使用函数,我尝试使用ListAgg()。首先,是否有更好的功能可用于将每行的GL与列表进行比较?此外,我可以使用SQL Developer获得下面的结果,但是当我尝试在Oracle返回ORA-01002错误的网页上输出结果时。我们在两种情况下都使用12c。下面是查询和输出。如果没有ListAgg(),我必须在SELECT和GROUP BY中包含GL列,并且它不合需要地为每个GL输出一个单独的行。

SELECT h.h_spa_id as spa_id,
       h.submit_dt,
       h.oa_ap_date,
       ListAgg(gl,',') within group (order by gl) "mygl"
 WHERE h.next_apprv= 'approverID'
   and h.table1_id = d.table2_id
   and h.table1_id = table3_id
 group by h.h_spa_id,h.submit_dt,h.oa_ap_date
 order by h.h_spa_id

H_SPA_ID    SUBMIT_DT               OA_AP_DATE                        MYGL
1627005    1/25/2008 10:11:53 AM   1/25/2008 11:15:56 AM      52287,52287,52287,52287,52287,52287,52287,52287,52287,52287,52385,52385,52385,52385,52385,52385,52385,52385,52385,52385,52385,52385,52385,52385,52385

1 个答案:

答案 0 :(得分:0)

您可以使用CASTCOLLECT将其分组到一个集合中:

SELECT   h.h_spa_id as spa_id,
         h.submit_dt,
         h.oa_ap_date,
         CAST( COLLECT( DISTINCT gl ) AS SYS.ODCINUMBERLIST ) AS mygl
FROM     h
         INNER JOIN
         d
         ON ( h.table1_id = d.table2_id )
WHERE    h.next_apprv = 'approverID'
AND      h.table1_id  = table3_id
GROUP BY h.h_spa_id,
         h.submit_dt,
         h.oa_ap_date
ORDER BY h.h_spa_id

然后,当您将其用于后续处理时,值将在数组中。