ORA-00904: ORDER BY 与 UNION ALL

ORA-00904: ORDER BY with UNION ALL

我正在使用 header 创建一个平面文件。我收到一个 ORA-00904 错误,我认为这是因为我创建的 header 没有字段 'employee_name'(我的假设是否正确?)。 如果是,我如何在没有 header 的情况下对查询进行排序?

我得到的错误:

    ORA-00904: "employee_id":invalid identifier
    

我的代码:

    select 'FILENAME' as filerec from dual
    UNION ALL
    select 'FILEDATE: ' || to_char(sysdate,'mm/dd/yyyy) as filerec from dual
    UNION ALL
    select employee_id || emloyee_name from employee_database as filerec
    order by employee_id;
    

这是我想要产生的输出:

    FILENAME
    FILEDATE: 02/27/2015
    200125Ruth Chan
    200126Dan Gonzales
    200135Lisa Mayoral
    

UNION 的最后一部分放在方括号中可能会成功:

select 'FILENAME' as filerec from dual
UNION ALL
select 'FILEDATE: ' || to_char(sysdate,'mm/dd/yyyy) as filerec from dual
UNION ALL
(select employee_id || emloyee_name from employee_database as filerec
    order by employee_id);

编辑:由于没有内在的顺序,更好的方法是:

select 'FILENAME' as filerec from dual
, 1 sortorder    
UNION ALL
select 'FILEDATE: ' || to_char(sysdate,'mm/dd/yyyy) as filerec from dual
, 2 sortorder
UNION ALL
select employee_id || emloyee_name from employee_database as filerec
, 3 sortorder
ORDER BY sortorder, filerec;

您可能需要将它放在子查询中,因为您可能不想 select 属性排序。

尝试按列位置编号而不是列名称排序

select 'FILENAME' as filerec from dual
UNION ALL
select 'FILEDATE: ' || to_char(sysdate,'mm/dd/yyyy) as filerec from dual
UNION ALL
select employee_id || emloyee_name from employee_database as filerec
order by 1;

或使用别名

select 'FILENAME' as filerec from dual
UNION ALL
select 'FILEDATE: ' || to_char(sysdate,'mm/dd/yyyy) as filerec from dual
UNION ALL
select employee_id || emloyee_name as filerec from employee_database 
order by filerec;

SQL中,您不能使用复合语句ORDER BY中的列命名,你必须使用列位置

或者,

显式投影列

在您的情况下,由于您连接了列,因此无法显式投影它们,而且列位置也没有任何意义。因此,您可以玩一个小把戏。添加一个伪列,将所需的值添加到要首先排序的行,然后在要在第一列之后排序的伪列中使用 NULL 值。因此,NULL 总是放在排序的末尾。

例如,

SQL> SELECT filerec FROM (
  2      SELECT 'FILENAME' AS filerec, 1 col FROM dual
  3      UNION ALL
  4      SELECT 'FILEDATE: ' || to_char(SYSDATE,'mm/dd/yyyy') as filerec, 2 col FROM dual
  5      UNION ALL
  6      SELECT empno || ename AS filerec, NULL col FROM emp
  7      ORDER BY 2,1
  8  );

FILEREC
--------------------------------------------------
FILENAME
FILEDATE: 02/27/2015
7369SMITH
7499ALLEN
7521WARD
7566JONES
7654MARTIN
7698BLAKE
7782CLARK
7788SCOTT
7839KING
7844TURNER
7876ADAMS
7900JAMES
7902FORD
7934MILLER

16 rows selected.

SQL>