Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Truy vấn đệ quy cho các phụ thuộc bảng không đệ quy không nhiều như tôi muốn

Bạn muốn một cái gì đó như thế này:

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

Vấn đề với truy vấn ban đầu là uc.constraint_name cho bảng con là tên của khóa ngoại. Điều đó là tốt cho việc kết nối con đầu tiên với bảng gốc, nhưng nó không phải là những gì bạn cần để kết nối các con ở cấp độ thứ hai với cấp độ đầu tiên. Đó là lý do tại sao bạn cần tham gia chống lại các ràng buộc hai lần - một lần để lấy khóa chính của bảng, một lần để lấy khóa ngoài.

Ngoài ra, nếu bạn định truy vấn các chế độ xem all_ * thay vì các chế độ xem user_ *, bạn thường muốn kết hợp chúng trên table_name VÀ chủ sở hữu, không chỉ table_name. Nếu nhiều lược đồ có các bảng trùng tên, việc chỉ kết hợp trên table_name sẽ cho kết quả không chính xác.



  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 động Pivot_In_Clause

  2. Lưu trữ nhiều giá trị cho một trường trong cơ sở dữ liệu

  3. Định nghĩa một cách có điều kiện một con trỏ

  4. php oci_bind_by_name float thành số

  5. Ngày trích xuất từ ​​chuỗi oracle