Oracle
 sql >> база данни >  >> RDS >> Oracle

Връщане на имена на колони на Oracle във формат table.column?

В 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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да върна набор от резултати от прозорец на заявка в Oracle SQL Developer?

  2. Oracle sql - присъединяване с входен параметър

  3. Преобразуване на NOT IN в NOT EXISTS

  4. оракул varchar към номер

  5. оратоп