许多 SQL 数据库支持 SQL 标准所称的<derived column list>
. 此类数据库至少包括 CUBRID、Derby、Firebird、HSQLDB、Postgres、SQL Server 和 Sybase SQL Anywhere。SQL:2008 规范中的(简化的)摘录
7.6 <table reference>
Format
<table reference> ::=
<table or query name> [ [ AS ] <correlation name>
[ <left paren> <derived column list> <right paren> ] ]
| <derived table> [ AS ] <correlation name>
[ <left paren> <derived column list> <right paren> ]
这意味着,我可以表达这样的事情(例如在 Postgres 中,它非常符合标准)
-- Rename a <table or query name> to u(b)
with t(a) as (select 1)
select * from t as u(b)
-- Rename a <derived table> to u(b)
select * from (select 1) as u(b)
现在,根据Oracle 文档,我无法使用<derived column list>
规范重命名列。我当然可以分别重命名表和列,如下所示:
-- Rename a <table or query name> to u(b)
with t(a) as (select 1 from dual)
select u.a b from t u;
-- Rename a <derived table> to u(b)
select u.a b from (select 1 a from dual) u;
但这比以前的语法需要更多关于派生表(实际列名)的知识。此外,重命名的列仅在投影之后可用(例如在ORDER BY
子句中),而不是在任何其他子句中,包括投影本身。
在 Oracle(以及 MySQL)中,是否有更通用的方法来按照 SQL 标准建议的方式重命名表和列?特别是,这对于数组取消嵌套、透视表/取消透视表重命名、内联复杂子查询、重命名表函数的结果等可能很有用。
注意:请不要过分关注上面的例子。他们真的只是为了说明问题。现实世界的查询要复杂得多,所以我正在寻找一种非常通用的方法来实现重命名为u(b)
注意:我仍在寻找适用于 MySQL 等数据库的解决方案。一个相关问题:
如何从子选择中选择无别名的数字文字