sql >> Database >  >> RDS >> Oracle

Retourneer Oracle-kolomnamen in table.column-indeling?

Er is geen "optie" in Oracle om dit te doen; je mag in staat zijn om een ​​klant te vinden die u dit toestaat, aangezien dit een taak is die normaal in de klant zou worden gedaan; Ik ken er geen.

Om uit te breiden op tbone's antwoord je zult dit dynamisch moeten doen. Dit niet betekent dat je elke kolom moet vermelden. U zou het datawoordenboek gebruiken , in het bijzonder alle_tab_columns of user_tab_columns om uw vraag te maken. Het zou gemakkelijker zijn om een ​​weergave te maken met de exacte definitie die u wilt, zodat u deze desgewenst opnieuw kunt gebruiken.

Het doel is om het feit dat het bestaan ​​van de kolommen in een tabel is opgeslagen als een tekenreeks te gebruiken om een ​​query te maken om die kolom te gebruiken. Omdat de kolomnamen en tabelnamen worden opgeslagen als tekenreeksen, kunt u technieken voor tekenreeksaggregatie gebruiken om eenvoudig een query of DDL-instructie te maken die u vervolgens handmatig of dynamisch kunt uitvoeren.

Als u Oracle 11g Release 2 gebruikt, de listagg functie is beschikbaar om u te helpen:

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

Uitgaande van deze tabelstructuur:

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

Deze enkele zoekopdracht levert het volgende op:

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

en hier is een SQL Fiddle om het te bewijzen.

Als u 11.2 niet gebruikt, kunt u exact dezelfde resultaten bereiken met de ongedocumenteerde functie wm_concat of de door de gebruiker gedefinieerde functie stragg , die is gemaakt door Tom Kyte. Oracle Base heeft een artikel over technieken voor stringaggregatie en er zijn veel berichten op Stack Overflow.

Als een kleine toevoeging kunt u precies creëren wat u zoekt met een kleine wijziging in de bovenstaande zoekopdracht. U kunt een identificatiecode tussen aanhalingstekens gebruiken om een ​​kolom te maken in de TABLE_NAME.COLUMN_NAME formaat. Je hebt om het te citeren als . is geen geldig teken voor een objectnaam in Oracle. Het voordeel hiervan is dat je precies krijgt wat je wilt. Het nadeel is dat het opvragen van de gemaakte weergave enorm lastig is als je select * from ... niet gebruikt.; het selecteren van benoemde kolommen is vereist ze moeten worden geciteerd.

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

Deze zoekopdracht retourneert :

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. MySQL-query - ontbrekende records ophalen bij gebruik van group-by

  2. hoe een huwelijksrelatie op te slaan in een database

  3. Upgraden naar PostgreSQL13

  4. Hoe datums met verschillende nauwkeurigheidsniveaus in postgres opslaan?