在带有 ORDER BY 的子选择中使用 JSON_ARRAYAGG 会出错

Posted

技术标签:

【中文标题】在带有 ORDER BY 的子选择中使用 JSON_ARRAYAGG 会出错【英文标题】:Using JSON_ARRAYAGG in a Sub-Select with ORDER BY gives error 【发布时间】:2020-11-06 14:07:33 【问题描述】:

使用 Oracle 19c:

我有以下查询,其中子选择(通过plans1_.ID 链接到主选择)使用JSON_ARRAYAGG 函数。

select
    ... , /* Other columns... */
    (SELECT
        json_arrayagg(json_object('sentDate' value mh.sent_date,
                                  'sentByEmail' value mh.send_by_email,    
                                  'sentBy' value mh.sent_by,
                                  'sentByName' value mh.sent_by_name,
                                  'sentToEmail' value mh.sendee_email) RETURNING CLOB) 
        from mail_history_t mh 
        where mh.plan_id = plans1_.id and mh.is_current_status = 'Y' 
        /*---This is the problem block: If I remove this ORDER BY the query works---*/
        order by mh.sent_date desc 
    ) as col_33_0_, 
    /* ... */

    from TABLE_T table0_ 
    left outer join PLANS_T plans1_ 
        on table0_.SOME_ID=plans1_.SOME_ID
    where ... /* etc. */

当我将order by 作为我的select from mail_history_t mh 的一部分时,我得到了错误

00907. 00000 -  "missing right parenthesis"

但是当我去掉order by 子句时,查询就起作用了。此外,如果我要隔离它,子选择会自行工作。

我的目标是获取列满足条件但按sent_date DESC 排序的行的 JSON 数组表示。

【问题讨论】:

不要在子查询中排序。这是不允许的。 【参考方案1】:

JSON_ARRAYAGG() 接受自己的ORDER BY 子句:

json_arrayagg(json_object('sentDate' value mh.sent_date,
                          'sentByEmail' value mh.send_by_email,    
                          'sentBy' value mh.sent_by,
                          'sentByName' value mh.sent_by_name,
                          'sentToEmail' value mh.sendee_email
                         ) ORDER BY mh.sent_date desc RETURNING CLOB
              ) 

不建议在子查询中使用ORDER BY

【讨论】:

以上是关于在带有 ORDER BY 的子选择中使用 JSON_ARRAYAGG 会出错的主要内容,如果未能解决你的问题,请参考以下文章

带有“order by”的派生表使用临时表和文件排序,即使我只选择主键

在 JPA Criteria API 的子查询中使用 ORDER BY 的替代方法是啥?

带有 UNION 子句的 ORDER BY

在SQL Server的子查询视图内联函数等数据库对象中,不应该单独使用ORDER BY语句

ORDER BY SQLAlchemy 中的子查询

mysql使用带有子查询的临时表,但不是group by和order by