Det finns inget "alternativ" i Oracle för att göra detta; du får kunna hitta en klient som tillåter dig att göra det eftersom detta är ett jobb som normalt skulle utföras i klienten; Jag känner inte till någon.
För att utöka tbones svar
du kommer att behöva göra detta dynamiskt. Detta gör inte innebär att du måste lista varje kolumn. Du skulle använda dataordboken
, närmare bestämt all_tab_columns
eller user_tab_columns
för att skapa din fråga. Det skulle vara lättare att skapa en vy med exakt den definition du vill ha så att du kan återanvända den om du vill.
Syftet är att använda det faktum att kolumnernas existens lagras i en tabell som en sträng för att skapa en fråga för att använda den kolumnen. Eftersom kolumnnamnen och tabellnamnen lagras som strängar kan du använda strängaggregationstekniker för att enkelt skapa en fråga eller DDL-sats som du sedan kan köra manuellt eller dynamiskt.
Om du använder Oracle 11g Release 2 är >listagg
funktionen är tillgänglig för att hjälpa dig:
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')
;
Antag denna tabellstruktur:
create table foo ( id number, a number, b number, c number);
create table bar ( foo_id number, a number, b number, c number);
Denna enda fråga producerar följande:
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
och här är en SQL-fiol för att bevisa det.
Om du inte använder 11.2 kan du uppnå exakt samma resultat med den odokumenterade funktionen wm_concat
eller den användardefinierade funktionen stragg
, som skapades av Tom Kyte. Oracle Base har en artikel om tekniker för strängaggregation
och det finns många inlägg på Stack Overflow.
Som ett litet tillägg kan du faktiskt skapa precis det du letar efter med en liten ändring av ovanstående fråga. Du kan använda en citerad identifierare
för att skapa en kolumn i TABLE_NAME.COLUMN_NAME
formatera. Du har för att citera det som .
är inte ett giltigt tecken för ett objektnamn i Oracle. Fördelen med detta är att du får precis det du vill ha. Nackdelen är att det är svårt att fråga efter den skapade vyn om du inte använder välj * från ...
; att välja namngivna kolumner kräver dem ska citeras.
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