Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Kembalikan nama kolom Oracle dalam format table.column?

Tidak ada "opsi" di Oracle untuk melakukan ini; Anda mungkin dapat menemukan klien yang memungkinkan Anda melakukannya karena ini adalah pekerjaan yang biasanya dilakukan di klien; Saya tidak tahu satu.

Untuk memperluas jawaban tbone Anda harus melakukan ini secara dinamis. Ini tidak berarti Anda harus membuat daftar setiap kolom. Anda akan menggunakan kamus data , khususnya all_tab_columns atau user_tab_columns untuk membuat kueri Anda. Akan lebih mudah untuk membuat tampilan dengan definisi persis yang Anda inginkan sehingga Anda dapat menggunakannya kembali jika Anda mau.

Tujuannya adalah untuk menggunakan fakta bahwa keberadaan kolom disimpan dalam tabel sebagai string untuk membuat kueri untuk menggunakan kolom itu. Karena nama kolom dan nama tabel disimpan sebagai string, Anda dapat menggunakan teknik agregasi string untuk dengan mudah membuat kueri atau pernyataan DDL yang kemudian dapat Anda jalankan secara manual, atau dinamis.

Jika Anda menggunakan Oracle 11g Release 2 listagg fungsi tersedia untuk membantu Anda:

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

Dengan asumsi struktur tabel ini:

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

Permintaan tunggal ini menghasilkan yang berikut:

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

dan inilah SQL Fiddle untuk membuktikannya.

Jika Anda tidak menggunakan 11.2, Anda dapat mencapai hasil yang persis sama menggunakan fungsi tidak berdokumen wm_concat atau fungsi yang ditentukan pengguna stragg , yang dibuat oleh Tom Kyte. Oracle Base memiliki artikel tentang teknik agregasi string dan ada banyak postingan di Stack Overflow.

Sebagai tambahan kecil, Anda sebenarnya dapat membuat apa yang Anda cari dengan sedikit perubahan pada kueri di atas. Anda dapat menggunakan pengidentifikasi yang dikutip untuk membuat kolom di TABLE_NAME.COLUMN_NAME format. Anda memiliki untuk mengutipnya sebagai . bukan karakter yang valid untuk nama objek di Oracle. Manfaat dari ini adalah Anda mendapatkan apa yang Anda inginkan. Kelemahannya adalah menanyakan tampilan yang dibuat sangat merepotkan jika Anda tidak menggunakan select * from ...; memilih kolom bernama akan membutuhkan mereka untuk dikutip.

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

Kueri ini kembali :

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. Bagaimana cara menghubungkan Oracle Cloud Instance menggunakan Oracle Cloud Shell?

  2. Skrip Liquibase mengembalikan ORA-01843:bukan bulan yang valid

  3. Mengembalikan nilai dari pernyataan insert

  4. Memfilter Log Peringatan di EM13c

  5. Di Oracle, apakah ada fungsi yang menghitung perbedaan antara dua Tanggal?