【问题标题】:Can't find ORA-00907: missing the right parenthesis找不到 ORA-00907:缺少右括号
【发布时间】:2019-01-17 23:49:49
【问题描述】:

我不知道这个语法有什么问题。

SELECT Count (id_conv) AS NUM_CAMP 
FROM   csd_mx_mae_camp_dro 
WHERE  id_conv = (SELECT id_conv 
                  FROM   csd_mx_mae_conv_dro 
                  WHERE  num_cta = 60385300500) 
       AND id_cncpt = (SELECT A.id_cncpt 
                       FROM   csd_mx_mae_camp_dro A 
                              INNER JOIN csd_mx_mae_cncpt_dro B 
                                      ON A.id_cncpt = B.id_cncpt 
                       WHERE  ( ( flg_tipo_camp = 'A' 
                                  AND txt_nombr_clase_logic IS NOT NULL ) 
                                 OR ( flg_tipo_camp = 'C' ) ) 
                              AND txt_nom NOT IN ( 'Concepto' ) 
                              AND B.txt_cve = '84' 
                              AND A.id_conv = (SELECT id_conv 
                                               FROM   csd_mx_mae_conv_dro 
                                               WHERE  num_cta = 60385300500) 
                              AND rownum = 1 
                       ORDER  BY id_cmp) 
       AND flg_tipo_camp = 'A'; 

考虑到我在数据库中的记录,预期的结果是 4,但是我有标题中提到的错误(ORA-00907:缺少右括号 00907. 00000 - “缺少右括号” * 原因: * 行动: 行错误:171,列:90)。

【问题讨论】:

  • 我在您的查询中没有发现任何问题。可能还有其他原因导致问题。没有更多的上下文,我无法提供进一步的帮助。
  • ORDER BY 在子查询中是无用的,并且会混淆 Oracle 解析器。
  • @stickybit - ORDER BY 在子查询中有时(甚至可能经常) 无用,但在某些情况下它是必需的(并且在语法上有效)。在 OP 的情况下,它永远不会有效,在 scalar 子查询中。在 IN 条件中使用它也是非法的(并且会引发相同的错误),用于子查询而不是硬编码值列表。
  • 比较:select empno from (select empno from emp ORDER BY SAL) where ROWNUM 1 - 一种冗长的方法来选择最低工资的员工(或最低工资的员工之一,如果是领带)。
  • Es Correcto,solo quitando el ORDER BY funcionó。

标签: sql oracle


【解决方案1】:

ORDER BY 有一些子查询是有意义的 - 并且语法允许。

但是,您在 标量 子查询中使用 ORDER BY - 需要返回单个值(一行/一列),并且此类子查询不允许 ORDER BY

无论如何您都在错误地使用它(很可能) - 您通过条件 ROWNUM = 1 将行数限制为 1,这与您的 ORDER BY 一起可能意味着您想通过 ID_CMP 订购然后取结果的第一行。这不是它的工作原理。 ORDER BY 仅在 之后才出现 ROWNUM 无论如何都被分配了。如果这是您想要做的,请删除 ORDER BY 以及 ROWNUM 上的条件,然后在标量子查询的 SELECT 子句中选择 MIN(ID_CMP)

关于缺少右括号的具体错误是由ORDER BY 子句引起的:此时,在标量子查询中,解析器期望子查询的右括号,而不是任何其他标记/子句/其他任何内容。

【讨论】:

    猜你喜欢
    • 2018-05-23
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多