我遇到一个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子句中的行顺序:”
“ ORA-00907:缺少右括号显然,当一个人收到这样的消息时,第一个反应可能是验证遗漏了什么括号,但是不幸的是,该语句中根本没有缺失的括号。
简而言之,难以理解的语法怪异总结如下:不要在IN子查询中使用ORDER BY。
现在,可能有人反对在IN子句中使用ORDER BY的确是没有道理的,这是对的,因为Oracle不在乎IN子句中的行顺序:”
我尝试使用WHERE子句和’=’而不是’IN’的SQL语句,但仍然抛出错误:’ missing right parenthesis‘。
missing right parenthesis
结论1 :
“在WHERE子句子查询中不要使用ORDER BY”或“在Oracle中不允许where子句中的子查询使用ORDER BY”
结论2
此案例研究还显示了我们应该进行JOIN而不是选择子查询的场景
问题是放置ORDER BY在WHERE子查询语句。SQL语法不允许您在WHERE子句中对子查询的元素进行排序,因为它不会整体改变查询的结果。
ORDER BY
WHERE
您应该将其移出以修复语法:
SELECT empid FROM employees WHERE deptid IN ( SELECT deptid FROM department WHERE description LIKE '%application%' ) ORDER BY createddate DESC
createddate不是employees表格中的一列。它仅存在于department表中
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