oracle 我可以在子查询中使用“IN(... ORDER BY字段)”子句吗?[已关闭]

yv5phkfx  于 2023-02-03  发布在  Oracle
关注(0)|答案(3)|浏览(152)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。

七年前就关门了。
Improve this question

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

zbdgwd5y1#

在使用in操作符的查询中不能使用order by子句。我猜拒绝使用它的原因是因为它没有意义-如果左侧操作数出现在右侧查询的结果中,in条件应该返回true。而不管它在结果中的相对位置如何。因此,允许您使用order by子句将使Oracle开发人员面临两个不受欢迎的选择之一:
1.执行昂贵、无用的排序
1.悄悄忽略order by子句。
这两个选项都不适合Oracle数据库的思维模式,所以我猜最简单的事情就是阻止这个选项。

7nbnzgx9

7nbnzgx92#

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

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

jvidinwx3#

如果问题是我可以使用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;

相关问题