Многие базы данных SQL поддерживают то, что стандарт SQL вызывает <derived column list>
. Такие базы данных включают по меньшей мере CUBRID, Derby, Firebird, HSQLDB, Postgres, SQL Server и Sybase SQL Anywhere. A (упрощенный) из спецификации 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
), а не в любых других предложениях, включая сам проект.
Существует ли более общий способ переименования таблиц И столбцов, как предлагает стандарт SQL, в Oracle (а также MySQL)? В частности, это может быть полезно для таких вещей, как переназначение массива, переименование таблицы pivot/unpivot, встраивание сложных подзапросов, переименование результатов из табличных функций и т.д.
N.B: Пожалуйста, не сосредотачивайтесь на приведенных выше примерах слишком много. Они действительно здесь, чтобы проиллюстрировать проблему. Реальные запросы гораздо сложнее, поэтому я ищу очень общий способ реализации переименования в u(b)
ПРИМЕЧАНИЕ. Я все еще ищу решение, которое работает в базе данных, например MySQL. Связанный с этим вопрос:
Как выбрать неустановленный числовой литерал из подвыборки