Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

तालिका निर्भरताओं के लिए रिकर्सिव क्वेरी उतनी ही रिकर्स नहीं कर रही है जितनी मैं चाहूंगा

आप कुछ इस तरह चाहते हैं:

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

मूल क्वेरी के साथ समस्या यह है कि चाइल्ड टेबल के लिए uc.constraint_name विदेशी कुंजी का नाम है। पहले बच्चे को रूट टेबल से जोड़ने के लिए यह ठीक है, लेकिन यह वह नहीं है जो आपको दूसरे स्तर के बच्चों को पहले से जोड़ने की जरूरत है। यही कारण है कि आपको दो बार बाधाओं के खिलाफ शामिल होने की आवश्यकता है - एक बार तालिका की प्राथमिक कुंजी प्राप्त करने के लिए, एक बार विदेशी कुंजी प्राप्त करने के लिए।

एक तरफ के रूप में, यदि आप user_* विचारों के बजाय all_* विचारों को क्वेरी करने जा रहे हैं, तो आप आम तौर पर उन्हें table_name और स्वामी पर शामिल करना चाहते हैं, न कि केवल table_name। यदि एक से अधिक स्कीमा में समान नाम वाली तालिकाएँ हैं, तो केवल table_name में शामिल होने से गलत परिणाम प्राप्त होंगे।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ग्रांट क्रिएट सेशन विशेषाधिकार कैसे प्रदान करें?

  2. 12c डेटा रिडक्शन

  3. Oracle RAC VIP और ARP प्राइमर

  4. InstallAllOracleASPNETProviders ठीक से काम नहीं करता है

  5. PL/SQL पुनरावृत्ति में फ़ोन नंबरों की पहचान करें