[英]Oracle select query with inner select query error
我收到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”或“where子句中的子查询不允许在Oracle中使用ORDER BY”
结论2
本案例研究还显示了我们应该选择JOIN而不是选择子查询的场景
问题是将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
显然,你不需要在子查询中使用order by
,你可以删除它,然后括号将是正确的
SELECT empid
FROM employees
WHERE deptid IN (SELECT deptid
FROM department
WHERE description LIKE '%application%');
如果您想order by
您的外部查询来执行order by
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.