繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM