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

时间:2014-07-14 21:13:38

标签: sql oracle11g

我收到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而不是选择子查询的场景

2 个答案:

答案 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,则必须在外部查询

上执行此操作