我收到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。
现在,人们可能会反对使用ORDER确实没有意义 BY里面的一个IN子句,这是真的,因为Oracle并不关心 关于IN子句中的行顺序:“
我尝试使用WHERE子句和'='而不是'IN'的SQL语句,它仍然抛出错误:'missing right parenthesis
'。
结论1 :
“不要在WHERE子句子查询中使用ORDER BY” 或者“where子句中的子查询不允许在Oracle中使用ORDER BY”
结论2
本案例研究还显示了我们应该选择JOIN而不是选择子查询的场景
答案 0 :(得分:6)
问题是将ORDER BY
放在WHERE
子句子查询中。 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
答案 1 :(得分:1)
显然,您的子查询中不需要order by
,您可以删除它,然后括号将是正确的
SELECT empid
FROM employees
WHERE deptid IN (SELECT deptid
FROM department
WHERE description LIKE '%application%');
如果您想申请order by
,则必须在外部查询