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>
我正在使用 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>