多くのSQLデータベースは、SQL標準で呼ばれるものをサポートしています<derived column list>
。このようなデータベースには、少なくともCUBRID、Derby、Firebird、HSQLDB、Postgres、SQL Server、およびSybaseSQLAnywhereが含まれます。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のようなデータベースで動作するソリューションをまだ探しています。関連する質問:
副選択からエイリアスされていない数値リテラルを選択する方法