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

Kueri rekursif untuk dependensi tabel tidak berulang tidak sebanyak yang saya inginkan

Anda menginginkan sesuatu seperti ini:

select t.table_name, level,lpad(' ', 2 * (level - 1))||t.table_name 
from user_tables t
join user_constraints c1 
    on (t.table_name = c1.table_name 
    and c1.constraint_type in ('U', 'P'))
left join user_constraints c2 
    on (t.table_name = c2.table_name 
    and c2.constraint_type='R')
start with t.table_name = 'ROOT_TAB'
connect by prior c1.constraint_name = c2.r_constraint_name

Masalah dengan kueri asli adalah bahwa uc.constraint_name untuk tabel anak adalah nama kunci asing. Itu bagus untuk menghubungkan anak pertama ke tabel root, tetapi bukan itu yang Anda perlukan untuk menghubungkan anak-anak di tingkat kedua ke yang pertama. Itulah mengapa Anda perlu bergabung melawan batasan dua kali -- sekali untuk mendapatkan kunci utama tabel, sekali untuk mendapatkan kunci asing.

Selain itu, jika Anda akan menanyakan tampilan all_* daripada tampilan user_*, Anda biasanya ingin menggabungkannya pada table_name DAN pemilik, bukan hanya table_name. Jika beberapa skema memiliki tabel dengan nama yang sama, bergabung hanya dengan nama_tabel akan memberikan hasil yang salah.



  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 mendefinisikan pemicu ON COMMIT di Oracle?

  2. jalankan string sebagai kueri di Oracle

  3. Oracle memesan hasil menggunakan kolom varchar campuran tetapi klausa di mana numerik

  4. SQL:AVG dengan Nilai NULL

  5. Mengkonsumsi layanan web dari Oracle PL/SQL