大家好,当我执行此查询时,它会抛出以下错误 -
ORA-00907: missing right parenthesis
。
但是,如果您从order by 1
移除其SELECT 2 FROM DUAL order by 1
工作。
我是否遗漏了这里的内容或其ORACLE限制
SELECT (CASE
WHEN EXISTS
(SELECT 1 FROM DUAL) THEN
(SELECT 4
FROM dual)
ELSE
(SELECT 2 FROM DUAL order by 1 )
END) AS DELEGATOR FROM dual
以下是已删除订单的工作代码
SELECT (CASE
WHEN EXISTS
(SELECT 1 FROM DUAL) THEN
(SELECT 4
FROM dual)
ELSE
(SELECT 2 FROM DUAL )
END) AS DELEGATOR FROM dual
答案 0 :(得分:1)
不知怎的,我已经放弃但是当我将代码更改为此时 它以某种方式工作。我申请了我的实际查询和结果 是预期的结果。
SELECT(CASE 什么时候存在 (选择1来自双)然后 (选择4 从双) 其他 (select * from(SELECT 2 FROM DUAL order by 1) 其中rownum = 1) END)AS DELEGATOR FROM dual
答案 1 :(得分:0)
scalar subquery expression从一行返回一个列值。如果表达式返回多行,则会出现错误," ORA-01427:单行子查询返回多行"。由于它只能有一个值,因此对该值进行排序将毫无意义。
缺少右括号错误并不一定意味着您有不平衡的括号,它可以指示使解析器在预期看到的位置放弃的其他错误。在这里,解析器期望子查询的右括号在FROM DUAL
之后,所以当它没有看到一个时它停止 - 实际上它并不知道如何解释声明的其余部分,以便它不会尝试(非常简单化)。
order by子句在子查询中没有意义,通常是不允许的;虽然在某些地方可以容忍,例如内联视图,尽管仍然没有效果。
显然你的例子非常有用,但有一种情况你可能认为你想要一个order by子句,那就是从你需要订购的结果集中获取第一个值。根据限制在其他数据库中的工作方式,您可能会尝试执行以下操作:
select (
select object_name from user_objects
where rownum = 1
order by created desc
)
from dual
......但这并不是rownum如何运作,也会得到ORA-00907。如果这就是您正在做的事情,您将需要另一层子查询(现在作为内联视图)可以订购,并将rownum过滤器应用于:
select (
select object_name from (
select object_name from user_objects
order by created desc
)
where rownum = 1
)
from dual
...现在有效。
(无论你是否真的需要在子查询中进行,而不是通过连接,这是另一回事 - 您的查询有望复杂到足以保证它。)
答案 2 :(得分:0)
SELECT 2 FROM DUAL order by 1
首先,ORDER BY
在这里没有意义,查询只返回一行。
其次,当没有排序行的意义时,你不能在Scalar Subquery Expression中使用order by
。在外部查询期望有序行集的某些情况下,将允许排序。在您的情况下,不存在超过单行的问题。
第三,编码为order by 1,2
等不是一种好的做法。而是使用适当的列名。您可能不会知道选择列表中的列是否发生更改,然后您的结果集会以不同方式排序,您需要在这两个位置进行更改。