【问题标题】:Oracle: Order by Union returning ORA-00933: SQL command not properly endedOracle:Union 排序返回 ORA-00933:SQL 命令未正确结束
【发布时间】:2014-04-18 15:00:05
【问题描述】:

我在同时使用 Oracle 的 union 和 order by 子句时遇到问题。

我有两个复杂的查询(其中包含子查询),每个查询都有一个 order by 子句。我需要合并两者的输出并返回结果。当我运行它时,我收到错误 ORA-00933: SQL 命令未正确结束。

但是当我注释掉它们中的 order by 子句时它会起作用。

为了测试这一点,我创建了一个简单的查询,如下所示

select * from employee where employee_id=2 order by name
union
select * from employee where employee_id=3 order by name;

即使在使用 order by 子句运行时也会出现相同的错误,但在我注释 order by 子句时运行良好。

我尝试搜索论坛,但我无法找到确切问题的解决方案。我在ORACLE Query with ORDER BY and UNION 找到了一个,但是由于子查询和太多表之间的连接,我的查询已经太复杂了,我不想实现这个。

谁能帮我解决问题的根本原因。

【问题讨论】:

  • 在任何集合并集的末尾只能有一个order by
  • 再次检查我的答案。

标签: oracle sql-order-by union ora-00933


【解决方案1】:

试试这个代码:

select  e1.name name /* e1.* */
  from employee e1
 where employee_id = 2
union
select 
  e2.name name /* e2.* */
  from employee e2
 where employee_id = 3
 order by name;

如果您想对第一个查询的结果进行排序,则对第二个查询的结果进行排序,这样您就可以这样做:

select 1 query, e1.name name /* e1.* */
  from employee e1
 where employee_id = 2
union
select 
 2 query, e2.name name /* e2.* */
  from employee e2
 where employee_id = 3
 order by query, name;

【讨论】:

  • 我已经试过了。这没有用。它给出错误:ORA-00904:“按子句顺序使用的列名”:无效标识符
  • 非常感谢您的快速帮助。我稍微修改了你的第一个建议,它对我有用。我只是在 select 和 order by 子句中将列别名更改为 name1。
【解决方案2】:

在最后一条语句上组合多个查询时,您只能有一个 ORDER BYORDER BY 子句作用于 整个 集合。

Oracle Documentation

您不能在这些运算符的子查询中指定 order_by_clause。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-09
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多