Oracle Listagg 子查询

Posted

技术标签:

【中文标题】Oracle Listagg 子查询【英文标题】:Oracle Listagg Sub query 【发布时间】:2016-11-10 16:25:33 【问题描述】:
SELECT e.pem_id          AS id,
     e.pem_subject     AS subject,
     e.pem_content     AS content,
     e.pem_sent_date   AS sentdate,
     e.pem_ref_id      AS referenceid,
     e.pem_from_usr_id AS userid,
     NULL              AS misc,
     (listagg(str.str_us_id, ', ') within GROUP(ORDER BY '') AS attachedusers FROM
      proj_email_usrs eu LEFT OUTER JOIN st_register str ON
      eu.pmu_str_id = str.str_id WHERE eu.pmu_pem_id = '26' GROUP BY '')
FROM   proj_email e
WHERE  e.pem_prj_id = '33'
AND    e.pmu_pem_id = '26'
AND    e.pem_status = 'S';

它正在抛出错误

ORA-01722: 无效号码

01722。 00000 - “无效号码”

*原因:指定的号码无效。

*操作:指定一个有效数字。

【问题讨论】:

我认为反引号不在您的查询中。 【参考方案1】:

我假设你想要这样的查询:

SELECT E.PEM_ID as Id, E.PEM_SUBJECT as Subject, E.PEM_CONTENT as Content,
       E.PEM_SENT_DATE as SentDate, E.PEM_REF_ID as ReferenceId,   
       E.PEM_FROM_USR_ID as UserId, NULL as Misc,
       (SELECT LISTAGG(STR.STR_US_ID, ', ') WITHIN GROUP (ORDER BY STR.STR_US_ID)
        FROM PROJ_EMAIL_USRS EU LEFT OUTER JOIN
             ST_REGISTER STR
             ON EU.PMU_STR_ID = STR.STR_ID
        WHERE EU.PMU_PEM_ID = E.PMU_PEM_ID  -- Correlation clause
       ) as AttachedUsers
FROM PROJ_EMAIL E 
WHERE E.PEM_PRJ_ID = 33 AND E.PMU_PEM_ID = 26 AND E.PEM_STATUS = 'S' ;

评论:

LISTAGG() 之前添加了SELECT。子查询需要。 删除GROUP BY。不需要,因为您希望子查询始终返回一行。 从可能是数字的常量中删除了单引号。仅对字符串和日期常量使用单引号。 向子查询添加了关联子句。 将列名移到子查询之外,因此在结果中命名。 为WITHIN GROUP 添加了ORDER BY 列。没有必要,但可以合理地保持 ID 有序。

【讨论】:

你让我很开心 :) 谢谢...工作正常...您已经解释了它值得称赞的原因。 我在 LEFT JOIN 子句上使用 LISTAGG 的某些行出现此错误,但在我以这种格式切换到子查询后工作。我真的不明白为什么在 LEFT JOIN 中使用选择的错误只出现在某些项目中...... @AndreyHartung 。 . .如果您有问题,请提出一个新的问题

以上是关于Oracle Listagg 子查询的主要内容,如果未能解决你的问题,请参考以下文章

Oracle sql使用子查询将多行结果分组为一行

Oracle 查询 -ListAgg

oracle子查询问题,急急急!

Oracle子查询

Oracle DB 使用子查询来解决查询

Oracle Day04 子查询