0

我正在编写一个触发器,它将通过使用 LISTAGG 函数从表中提取数据来将新插入的行插入另一个表。这是插入和选择语句。我收到 ORA-00937: not a single-group group function 错误。类别需要一个包含多个值的字符串,由 ; 分隔 . 有没有其他方法可以从 JOBS_JOBCLASS、JOBS_CLASSIFICATION 表中获取类别?

这是片段:

 INSERT INTO jobs_tfour_data
    (
       jobid,
       title,
       reference,
       salary,
       location,
       department,
       grade,       
       opendate,
       closedate,
       description,
       internal,
       category
    )     
   select :new.jobid,:new.TITLE,:new.REFERENCE,:new.SALARY,LOCATIONNAME,DEPTNAME,GRADENAME,:new.OPENDATE,:new.CLOSEDATE,:new.description,:new.internal, LISTAGG(CLASSNAME,'; ') WITHIN GROUP (order by cj.CLASSID) as category
   from JOBS_LOCATION l , JOBS_DEPARTMENT d, JOBS_GRADE g,JOBS_JOBCLASS cj ,JOBS_CLASSIFICATION c 
   where  
   l.locationid = :new.locationid 
   and d.deptid = :new.departmentid 
   and g.gradeid =  :new.gradeid  
   and cj.jobid = :new.jobid
   and cj.classid = c.classid   
    ;
4

1 回答 1

0

使用 oracle,您必须正确地对所有内容进行分组,它是无情的,并且会拒绝做任何事情,直到您“正确”地做这件事,这与宽容的 MySQL 不同:D

所以简而言之,一旦你使用一个聚合函数,就像你的情况一样Listagg,你需要手动处理分组。只需GROUP BY在查询末尾附加分句即可。

例如:

select :new.jobid,:new.TITLE,:new.REFERENCE,:new.SALARY,LOCATIONNAME,DEPTNAME,GRADENAME,:new.OPENDATE,:new.CLOSEDATE,:new.description,:new.internal, LISTAGG(CLASSNAME,'; ') WITHIN GROUP (order by cj.CLASSID) as category
   from JOBS_LOCATION l , JOBS_DEPARTMENT d, JOBS_GRADE g,JOBS_JOBCLASS cj ,JOBS_CLASSIFICATION c 
   where  
   l.locationid = :new.locationid 
   and d.deptid = :new.departmentid 
   and g.gradeid =  :new.gradeid  
   and cj.jobid = :new.jobid
   and cj.classid = c.classid  
   GROUP BY new.jobid,:new.TITLE,:new.REFERENCE,:new.SALARY,LOCATIONNAME,DEPTNAME,GRADENAME,:new.OPENDATE,:new.CLOSEDATE,:new.description,:new.internal

另外,请注意使用正确的(内部)联接(又名显式联接)会更好地阅读和调试。

于 2021-10-11T09:02:57.157 回答