【问题标题】:Oracle - ORA-00907: missing right parenthesisOracle - ORA-00907: 缺少右括号
【发布时间】:2021-07-29 18:38:43
【问题描述】:

我只是找不到这里有什么问题。试图选择文章图片的路径。 ORA-00907: 缺少右括号

select artnr, listagg(path, bildnr '.' filtyp) within group (order by bildnr) as sökväg
from kund 
where knr in (select knr
            from kundorder
            where ordnr in (select ordnr
            from orderrad
            where artnr in (select artnr
            from artikel
            where bildnr in (select bildnr
            from artikelbild))))
            order by artnr;

【问题讨论】:

  • 您是否尝试仅从kund 中选择以简化查询并找到有问题的部分? bildnr '.' filtyp 是什么?此外,非 ascii 字符不能用作不带引号的列名。

标签: sql oracle listagg


【解决方案1】:

listagg 中有明显错误(缺少连接):

No : listagg (path, bildnr '.' filtyp)
Yes: listagg (PATH, bildnr || '.' || filtyp)

其余的应该没问题(就语法而言;无法判断查询是否会(或不会)返回您想要的内容)。


另外,也许你宁愿切换到JOINs 而不是使用一堆嵌套的子查询,例如

  SELECT u.artnr,
         LISTAGG (u.PATH, u.bildnr || '.' || u.filtyp)
            WITHIN GROUP (ORDER BY u.bildnr) AS sokvag
    FROM kund u
         JOIN kundorder o ON u.knr = o.knr
         JOIN orderrad r ON r.ordnr = o.ordnr
         JOIN artikel a ON a.artnr = r.artnr
         JOIN artikelbild b ON b.bildnr = a.bildnr
ORDER BY u.artnr;

截至 ORA-30496:参数应该是一个常数:显然,这是真的。

您要运行的代码:

SQL> select listagg(e.ename, e.job ||'.'|| to_char(e.deptno))
  2           within group (order by null) result
  3  from emp e
  4  where rownum <= 3;
select listagg(e.ename, e.job ||'.'|| to_char(e.deptno))
                        *
ERROR at line 1:
ORA-30496: Argument should be a constant.

让我们尝试欺骗 Oracle 并“准备”分隔符:

SQL> with temp as
  2    (select e.ename, e.job ||'.'||to_char(e.deptno) separator
  3     from emp e
  4     where rownum <= 3
  5    )
  6  select listagg(t.ename, t.separator)
  7           within group (order by null)
  8  from temp t;
select listagg(t.ename, t.separator)
                        *
ERROR at line 6:
ORA-30496: Argument should be a constant.

仍然没有运气。但如果分隔符确实是一个常量(在我的示例中为逗号),那么它有效

SQL> select listagg(e.ename ||': ' || e.job, ', ')
  2           within group (order by null) result
  3  from emp e
  4  where rownum <= 3;

RESULT
------------------------------------------------------------------------
ALLEN: SALESMAN, SMITH: CLERK, WARD: SALESMAN

SQL>

【讨论】:

  • 谢谢!这似乎还有一些问题。 ORA-30496: 参数应该是一个常数
  • 另外,也许您更愿意切换到 JOIN - 仅适用于 [0..N] to [0..1] 关系,尤其是在发生聚合时。
  • Baibs,看来你不能有那个分隔符,它必须是“常量”(正如 Oracle 所说,例如逗号、分号、破折号或其他东西像这样。
  • 另一个选项(将所有路径保留在 builnr 和 filtyp 中)是通过u.bildnr, u.filtyplistagg 所有u.PATHs,然后是listagg(agg_upath || u.bildnr || '.' || u.filtyp, ',')(或任何所需的常量分隔符)。
  • 非常感谢,感谢您在这方面所做的工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-11
  • 2020-06-14
  • 2019-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
相关资源
最近更新 更多