我可以在子查询中使用“ORDER BY”子句吗?

时间:2015-12-20 07:03:07

标签: sql oracle oracle11g sql-order-by sql-in

SELECT * from table1 where column1 IN (SELECT column1 from table1 ORDER BY column1);

3 个答案:

答案 0 :(得分:6)

您不能在order by运算符使用的查询中使用in子句。我猜测拒绝使用它的原因是因为它没有意义 - 如果左侧操作数存在于右侧查询的结果中,则in条件应该返回true,而不管它在结果中的相对位置。因此,允许您使用order by条款会让Oracle的开发人员选择以下两个不具吸引力的选项之一:

  1. 执行昂贵,无用的排序,
  2. 默默无视order by条款。
  3. 这些选项都不适合Oracle数据库的思维模式,因此我猜测最简单的方法就是阻止此选项。

答案 1 :(得分:2)

简单直接的回答。为什么? order by的目的是为结果数据提供排序功能,子查询/内部查询数据不是最终输出,而是使用外部查询进一步操作的部分数据,因此具有order by在子查询中完全没有意义,完全不合逻辑。您应该在主查询中输入订单,例如

SELECT * from table1 
where column1 IN (SELECT column1 from table1)
 ORDER BY column1;

答案 2 :(得分:1)

如果问题是我可以使用ORDER BY ,答案非常简单。 Oracle语法检查接受ORDER BY或拒绝它。

在你的例子中

SELECT * from tab1 where col1 IN (SELECT col1 from tab1 ORDER BY col1);

您收到错误

ORA-00907: missing right parenthesis

语法检查器不接受子查询中的ORDER BY和关于缺少右括号的抱怨。你可能会看到语法检查,即使表不存在,你也会得到相同的错误。 (应该提到的是,在某些情况下,允许的语法是标准的扩展)。

问题我应该使用ORDER BY 是完全不同的,正如其他地方所讨论的那样。

添加示例

这里是一个允许子查询中的ORDER BY的例子

WITH t AS
  (SELECT col1 FROM tab ORDER BY col1
  )
SELECT * FROM t;

相反,这会导致语法错误

WITH t AS
  ( SELECT col1 FROM tab ORDER BY col1
  UNION ALL
  SELECT col1 FROM tab ORDER BY col1
  )
SELECT * FROM t;