【发布时间】: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 BYfuncionó。