SELECT * from table1 where column1 IN (SELECT column1 from table1 ORDER BY column1);
3 回答
您不能order by
在与运算符一起使用的查询中使用子句in
。我猜测拒绝使用它的原因是因为它毫无意义——in
如果左侧操作数存在于右侧查询的结果中,则条件应返回 true,而不管其在结果中的相对位置如何。因此,允许您在此处使用order by
子句将使 Oracle 的开发人员面临以下两种不吸引人的选择之一:
- 执行代价高昂、无用的排序,或
- 默默地忽略
order by
子句。
这些选项都不太适合 Oracle 数据库的思维方式,所以我猜最简单的方法就是阻止这个选项。
简单直接的答案NO。为什么?的目的order by
是为结果数据提供排序功能,子查询/内部查询数据不是最终输出,而是将使用外部查询进一步操作的部分数据,因此拥有一个order by
in 子查询根本没有意义而且不合逻辑共。你应该在你的主查询中有订单,比如
SELECT * from table1
where column1 IN (SELECT column1 from table1)
ORDER BY column1;
如果问题是我可以使用 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;