小编典典

带有内部选择查询错误的Oracle选择查询

sql

我遇到一个SQL错误并尝试解决,任何指针都会有所帮助,

//这将执行

SELECT empid FROM employees WHERE deptid IN (10,20,30,40 );

//这将执行

SELECT deptid FROM department WHERE description LIKE '%application%' 
  ORDER BY createddate DESC

但是下面的查询抛出错误:

SELECT empid  FROM employees WHERE deptid IN (SELECT deptid FROM department WHERE description LIKE '%application%' 
  ORDER BY createddate DESC);

错误:ORA-00907:缺少右括号00907。00000-“缺少右括号”

更新:07/14:

使用@dasblinkenlight更新确切的解决方案:

问题是将ORDER BY放在WHERE子句子查询中。SQL语法不允许您在WHERE子句中对子查询的元素进行排序,因为它不会改变查询的整体结果

本文很好地解释了许多概念-http://oraclequirks.blogspot.com/2008/01/ora-00907-missing-
right-
parenthesis.html

“ ORA-00907:缺少右括号显然,当一个人收到这样的消息时,第一个反应可能是验证遗漏了什么括号,但是不幸的是,该语句中根本没有缺失的括号。

简而言之,难以理解的语法怪异总结如下:不要在IN子查询中使用ORDER BY。

现在,可能有人反对在IN子句中使用ORDER BY的确是没有道理的,这是对的,因为Oracle不在乎IN子句中的行顺序:”

我尝试使用WHERE子句和’=’而不是’IN’的SQL语句,但仍然抛出错误:’ missing right parenthesis‘。

结论1

“在WHERE子句子查询中不要使用ORDER BY”或“在Oracle中不允许where子句中的子查询使用ORDER BY”

结论2

此案例研究还显示了我们应该进行JOIN而不是选择子查询的场景


阅读 122

收藏
2021-04-22

共1个答案

小编典典

问题是放置ORDER BYWHERE子查询语句。SQL语法不允许您在WHERE子句中对子查询的元素进行排序,因为它不会整体改变查询的结果。

您应该将其移出以修复语法:

SELECT empid  FROM employees WHERE deptid IN
    (
        SELECT deptid FROM department WHERE description LIKE '%application%'
    )
ORDER BY createddate DESC

createddate不是employees表格中的一列。它仅存在于department表中

然后,您需要连接到department表,并在表的ORDER BY其中一列上使用:

SELECT e.empid
FROM employees e
JOIN department d ON e.deptid = d.deptid
WHERE d.description LIKE '%application%'
ORDER BY d.createddate DESC
2021-04-22