【问题标题】:using LISTAGG in Orcale - ORA-00937: not a single-group group function在 Oracle 中使用 LISTAGG - ORA-00937:不是单组组函数
【发布时间】:2021-11-30 00:54:11
【问题描述】:

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

这里是sn-p:

 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   
    ;

【问题讨论】:

    标签: listagg ora-00937


    【解决方案1】:

    使用 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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-16
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 2014-08-06
      • 1970-01-01
      • 2022-01-19
      相关资源
      最近更新 更多