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

3 回答 3

6

您不能order by在与运算符一起使用的查询中使用子句in。我猜测拒绝使用它的原因是因为它毫无意义——in如果左侧操作数存在于右侧查询的结果中,则条件应返回 true,而不管其在结果中的相对位置如何。因此,允许您在此处使用order by子句将使 Oracle 的开发人员面临以下两种不吸引人的选择之一:

  1. 执行代价高昂、无用的排序,
  2. 默默地忽略order by子句。

这些选项都不太适合 Oracle 数据库的思维方式,所以我猜最简单的方法就是阻止这个选项。

于 2015-12-20T07:24:55.127 回答
3

简单直接的答案NO。为什么?的目的order by是为结果数据提供排序功能,子查询/内部查询数据不是最终输出,而是将使用外部查询进一步操作的部分数据,因此拥有一个order byin 子查询根本没有意义而且不合逻辑共。你应该在你的主查询中有订单,比如

SELECT * from table1 
where column1 IN (SELECT column1 from table1)
 ORDER BY column1;
于 2015-12-20T09:41:14.860 回答
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;
于 2015-12-20T09:24:16.163 回答