В Oracle няма "опция" за това; вие можете можете да намерите клиент, който ви позволява да го направите, тъй като това е работа, която обикновено се извършва в клиента; Не знам за такъв.
За да разширите отговора на tbone
ще трябва да направите това динамично. Това не означава, че трябва да посочите всяка колона. Ще използвате речник на данни
, по-специално all_tab_columns
или user_tab_columns
за да създадете вашата заявка. Би било по-лесно да създадете изглед с точната дефиниция, която искате, така че да можете да го използвате повторно, ако желаете.
Целта е да се използва фактът, че съществуването на колоните се съхранява в таблица като низ, за да се създаде заявка за използване на тази колона. Тъй като имената на колоните и имената на таблиците се съхраняват като низове, можете да използвате техники за агрегиране на низове, за да създадете лесно заявка или DDL израз, които след това можете да изпълните ръчно или динамично.
Ако използвате Oracle 11g Release 2, listagg
функция е налична, за да ви помогне:
select 'create or replace view my_view as
select '
|| listagg( table_name || '.' || column_name
|| ' as '
|| substr(table_name,1,1) || '_'
|| column_name, ', ')
within group
( order by case when table_name = 'FOO' then 0 else 1 end
, column_id
)
|| ' from foo f
join bar b
on f.id = b.foo_id'
from user_tab_columns
where table_name in ('FOO','BAR')
;
Ако приемем тази структура на таблицата:
create table foo ( id number, a number, b number, c number);
create table bar ( foo_id number, a number, b number, c number);
Тази единствена заявка произвежда следното:
create or replace view my_view as
select FOO.ID as F_ID, FOO.A as F_A, FOO.B as F_B, FOO.C as F_C
, BAR.FOO_ID as B_FOO_ID, BAR.A as B_A, BAR.B as B_B, BAR.C as B_C
from foo f
join bar b on f.id = b.foo_id
и ето SQL Fiddle за да го докажа.
Ако не използвате 11.2, можете да постигнете точно същите резултати, като използвате недокументираната функция wm_concatкод>
или дефинираната от потребителя функция stragg
, който е създаден от Том Кайт. Oracle Base има статия за техники за агрегиране на низове
и има много публикации в Stack Overflow.
Като малко допълнение можете всъщност да създадете точно това, което търсите, с малка промяна в горната заявка. Можете да използвате идентификатор в кавички
за да създадете колона в TABLE_NAME.COLUMN_NAME
формат. Вие имате за да го цитирате като .
не е валиден знак за име на обект в Oracle. Ползата от това е, че получавате точно това, което искате. Недостатъкът е, че заявката за създадения изглед е огромна болка, ако не използвате select * from ...
; избирането на именувани колони ще изисква те да бъдат цитирани.
select 'create or replace view my_view as
select '
|| listagg( table_name || '.' || column_name
|| ' as '
|| '"' || table_name || '.'
|| column_name || '"', ', ')
within group
( order by case when table_name = 'FOO' then 0 else 1 end
, column_id
)
|| ' from foo f
join bar b
on f.id = b.foo_id'
from user_tab_columns
where table_name in ('FOO','BAR')
;
create or replace view my_view as
select FOO.ID as "FOO.ID", FOO.A as "FOO.A", FOO.B as "FOO.B", FOO.C as "FOO.C"
, BAR.FOO_ID as "BAR.FOO_ID", BAR.A as "BAR.A"
, BAR.B as "BAR.B", BAR.C as "BAR.C"
from foo f
join bar b on f.id = b.foo_id