SELECT * from table1 where column1 IN (SELECT column1 from table1 ORDER BY column1);
答案 0 :(得分:6)
您不能在order by
运算符使用的查询中使用in
子句。我猜测拒绝使用它的原因是因为它没有意义 - 如果左侧操作数存在于右侧查询的结果中,则in
条件应该返回true,而不管它在结果中的相对位置。因此,允许您使用order by
条款会让Oracle的开发人员选择以下两个不具吸引力的选项之一:
order by
条款。这些选项都不适合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;