sql >> Database teknologi >  >> RDS >> Oracle

Vil du returnere Oracle-kolonnenavne i table.column-format?

Der er ingen "mulighed" i Oracle for at gøre dette; du være i stand til at finde en klient, der tillader dig at gøre det, da dette er et job, der normalt ville blive udført i klienten; Jeg kender ikke en.

For at uddybe tbones svar du bliver nødt til at gøre dette dynamisk. Dette ikke betyder, at du skal liste hver kolonne. Du ville bruge dataordbogen , specifikt all_tab_columns eller user_tab_columns for at oprette din forespørgsel. Det ville være nemmere at oprette en visning med den nøjagtige definition, du ønsker, så du kan genbruge den, hvis du vil.

Målet er at bruge det faktum, at kolonnens eksistens er gemt i en tabel som en streng for at oprette en forespørgsel til at bruge den kolonne. Da kolonnenavne og tabelnavne er gemt som strenge, kan du bruge strengaggregeringsteknikker til nemt at oprette en forespørgsel eller DDL-sætning, som du derefter kan udføre manuelt eller dynamisk.

Hvis du bruger Oracle 11g Release 2, er code>listagg funktion er tilgængelig for at hjælpe 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')
        ;

Forudsat denne tabelstruktur:

create table foo ( id number, a number, b number, c number);
create table bar ( foo_id number, a number, b number, c number);

Denne enkelt forespørgsel producerer følgende:

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

og her er en SQL Fiddle for at bevise det.

Hvis du ikke bruger 11.2, kan du opnå nøjagtig de samme resultater ved at bruge den udokumenterede funktion wm_concat eller den brugerdefinerede funktion stragg , som blev skabt af Tom Kyte. Oracle Base har en artikel om strengaggregeringsteknikker og der er mange indlæg på Stack Overflow.

Som et lille tillæg kan du faktisk skabe præcis det, du leder efter, med en lille ændring af ovenstående forespørgsel. Du kan bruge en citeret identifikator for at oprette en kolonne i TABLE_NAME.COLUMN_NAME format. Du har for at citere det som . er ikke et gyldigt tegn for et objektnavn i Oracle. Fordelen ved dette er, at du får præcis det, du ønsker. Ulempen er, at det er en stor smerte at forespørge på den oprettede visning, hvis du ikke bruger vælg * fra ...; at vælge navngivne kolonner kræver dem skal citeres.

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')
        ;

Denne forespørgsel returnerer :

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


  1. Hvordan kan jeg se forespørgsler, der udføres mod Oracle?

  2. Hvordan forbedrer man SQL-indsæt-forespørgselsydeevnen?

  3. Sådan starter du PostgreSQL Server på Mac OS X via Homebrew

  4. Flader underordnede/forældredata med ukendt antal kolonner