sql >> Databáze >  >> RDS >> Oracle

Vrátit názvy sloupců Oracle ve formátu table.column?

V Oracle neexistuje žádná "možnost" to udělat; můžete umět najít klienta, který vám to umožní, protože se jedná o práci, která by se normálně dělala u klienta; Nevím o žádném.

Chcete-li rozšířit odpověď tbone budete to muset dělat dynamicky. Toto není znamená, že musíte vypsat každý sloupec. Použili byste datový slovník , konkrétně all_tab_columns nebo user_tab_columns k vytvoření vašeho dotazu. Bylo by jednodušší vytvořit pohled s přesnou definicí, kterou chcete, abyste jej mohli znovu použít, pokud chcete.

Cílem je využít skutečnosti, že existence sloupců je uložena v tabulce jako řetězec, k vytvoření dotazu pro použití daného sloupce. Protože jsou názvy sloupců a tabulky uloženy jako řetězce, můžete použít techniky agregace řetězců ke snadnému vytvoření dotazu nebo příkazu DDL, které pak můžete ručně nebo dynamicky spustit.

Pokud používáte Oracle 11g Release 2, listagg je k dispozici funkce, která vám pomůže:

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

Za předpokladu této struktury tabulky:

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

Tento jediný dotaz vytvoří následující:

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 zde je SQL Fiddle abych to dokázal.

V nepoužíváte 11.2 můžete dosáhnout přesně stejných výsledků pomocí nezdokumentované funkce wm_concat nebo uživatelem definovaná funkce stragg , kterou vytvořil Tom Kyte. Oracle Base má článek o technikách agregace řetězců a na Stack Overflow je mnoho příspěvků.

Jako malý doplněk můžete vytvořit přesně to, co hledáte, s malou změnou výše uvedeného dotazu. Můžete použít uvedený identifikátor k vytvoření sloupce v TABLE_NAME.COLUMN_NAME formát. máte citovat jej jako . není platný znak pro název objektu v Oracle. Výhodou je, že získáte přesně to, co chcete. Nevýhodou je, že dotazování na vytvořený pohled je obrovská bolest, pokud nepoužijete select * from ...; výběr pojmenovaných sloupců bude vyžadovat mají být citovány.

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

Tento dotaz se vrací :

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. SQL aktualizace polí jedné tabulky z polí jiné tabulky

  2. žádný záznam pg_hba.conf pro hostitele

  3. Jak oddělit data v SQL tabulce

  4. Existuje systém správy verzí pro změny struktury databáze?