W Oracle nie ma takiej opcji; możesz być w stanie znaleźć klienta, który pozwoli ci to zrobić, ponieważ jest to praca, która normalnie byłaby wykonywana u klienta; Nie znam jednego.
Aby rozwinąć odpowiedź tbone
będziesz musiał to robić dynamicznie. To nie oznacza, że musisz wymienić każdą kolumnę. Możesz użyć słownika danych
, w szczególności all_tab_columns
lub user_tab_columns
aby utworzyć zapytanie. Łatwiej byłoby utworzyć widok z dokładną definicją, którą chcesz, aby móc go ponownie użyć, jeśli chcesz.
Celem jest wykorzystanie faktu, że istnienie kolumn jest przechowywane w tabeli jako ciąg znaków w celu utworzenia zapytania do użycia tej kolumny. Ponieważ nazwy kolumn i nazwy tabel są przechowywane jako ciągi, można użyć technik agregacji ciągów, aby łatwo utworzyć zapytanie lub instrukcję DDL, którą można następnie wykonać ręcznie lub dynamicznie.
Jeśli używasz Oracle 11g Release 2, listagg
funkcja jest dostępna, aby Ci pomóc:
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')
;
Zakładając taką strukturę tabeli:
create table foo ( id number, a number, b number, c number);
create table bar ( foo_id number, a number, b number, c number);
To pojedyncze zapytanie daje następujące wyniki:
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
a oto SQL Fiddle aby to udowodnić.
Jeśli nie używasz 11.2 możesz osiągnąć dokładnie te same wyniki używając nieudokumentowanej funkcji wm_concat
lub funkcja zdefiniowana przez użytkownika stragg
, który został stworzony przez Toma Kyte. Oracle Base ma artykuł na temat technik agregacji ciągów
i jest wiele postów na Stack Overflow.
Jako mały dodatek, możesz stworzyć dokładnie to, czego szukasz, z niewielką zmianą w powyższym zapytaniu. Możesz użyć identyfikatora cytowanego
aby utworzyć kolumnę w TABLE_NAME.COLUMN_NAME
format. masz zacytować go jako .
nie jest poprawnym znakiem dla nazwy obiektu w Oracle. Zaletą tego jest to, że zyskujesz dokładnie to, czego chcesz. Minusem jest to, że odpytywanie utworzonego widoku jest ogromnym problemem, jeśli nie używasz wybierz * z ...
; wybranie nazwanych kolumn wymaga należy je zacytować.
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