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

कॉन्फिग टेबल का उपयोग करते हुए डायनेमिक एसक्यूएल

यह थोड़ा गड़बड़ है, लेकिन आप इसे सादे एसक्यूएल में कर सकते हैं, जो कि एक श्रेणीबद्ध क्वेरी के साथ शुरू होता है, जो कि समेकित तार प्राप्त करने के लिए होता है:

कुंजीमान चुनें, तालिका से, colsउपलब्ध, rnk, ltrim(sys_connect_by_path(colsavailable, '||''|'||'), '||''|'''||') पाथफ्रॉम ordercols_forviewसाथ शुरू करें आरएनके =1कीवैल्यू द्वारा कनेक्ट करें =पूर्व कीवैल्यूऔर आरएनके =पूर्व आरएनके + 1और पूर्व डीबीएमएस_रैंडम.वैल्यू कीवैल्यू, तालिका से, कॉल्सउपलब्ध, आरएनके द्वारा अशक्त नहीं है; KEYVALUE FR COLS RNK पाथ ---------- ----------------------------- ----------------------------- 1 A1 NUM1 1 NUM1 1 A1 NUM2 2 NUM1 ||'|'||NUM2 1 A1 NUM3 3 NUM1||'|'||NUM2||'|'||NUM3 2 B1 NUM1 1 NUM1 2 B1 NUM2 2 NUM1||'|'||NUM2 2 B1 NUM3 3 NUM1||'|'|| NUM2||'|'||NUM3 2 B1 NUM4 4 NUM1||'|'||NUM2||'|'||NUM3||'|'||NUM4 3 C1 NUM1 1 NUM1 3 C1 NUM2 2 NUM1|| '|'||NUM2 3 C1 NUM3 3 NUM1||'|'||NUM2||'|'||NUM3 3 C1 NUM4 4 NUM1||'|'||NU M2||'|'||NUM3||'|'||NUM4 3 C1 NUM5 5 NUM1||'|'||NUM2||'|'||NUM3||'|'||NUM4||'| '||NUM5  

मैंने माना है कि आपकी तालिका में वास्तव में एक और कॉलम है जिसे आपने नहीं दिखाया है जो कॉलम की स्थिति देता है। यदि नहीं, तो आप इसे किसी भी तरह उत्पन्न कर सकते हैं - शायद आधार तालिका कॉलम, वर्णानुक्रम, या जो कुछ भी के लिए column_id पर आधारित हो। कनेक्ट-बाय क्लॉज के लिए आपको बस एक सन्निहित संख्या अनुक्रम की आवश्यकता है।

फिर आप उन कॉलम और पथ मानों के टेक्स्ट भाग प्राप्त करने के लिए दो यूनियनों का उपयोग कर सकते हैं (क्योंकि उन्हें आपकी अंतिम तालिका में अलग-अलग पंक्तियों की आवश्यकता होती है), साथ ही SELECT ... के लिए अतिरिक्त वाले और से ... लाइनें। उनमें से प्रत्येक को एक और उत्पन्न रैंक संख्या की आवश्यकता होती है। जिन्हें CTE में रैंकिंग से उत्पन्न किया जा सकता है:

ordercols_forview_cte as के साथ (की-वैल्यू चुनें, टेबल से, कोल्सउपलब्ध, rnk, ltrim(sys_connect_by_path(colsavailable, '||''|''||'), '||''|''||') जैसा कि ordercols_forview से पथ rnk =1 से शुरू होता है, keyvalue =पूर्व keyvalue और rnk =पूर्व rnk + 1 और पूर्व dbms_random.value शून्य नहीं है) से कनेक्ट करें 'क्रिएट या रिप्लेस व्यू' चुनें || s.view_to_be_created || 'जैसा चुनें' टेक्स्ट के रूप में, s.view_to_be_created, 1 rnkfrom Seeding_table sunion allselect 'KEYVALUE', टेक्स्ट के रूप में, s.view_to_be_created, 2 rnkfrom Seeding_table sunion allselect o.path || ' कुंजी के रूप में' || o.rnk || मामला जब o.rnk  

जो आपके शुरुआती डेटा से उत्पन्न करता है:

  टेक्स्ट वी आरएनके ------------------------------------------- ------------------- - ---------- एक 1कुंजी मान के रूप में एक दृश्य बनाएं या बदलें, एक 2NUM1 कुंजी 1 के रूप में, एक 3NUM1 नंबर 1 के रूप में, A 4NUM1||'|'||NUM2 AS KEY2, A 5NUM2 AS NO2, A 6NUM1||'|'||NUM2||'|'||NUM3 AS KEY3 A 7NUM3 AS NO3 A 8FROM A1; A 9बनाएँ या बदलें B को चुनें B 1कुंजी मान के रूप में, B 2NUM1 को KEY1, B 3NUM1 को NO1, B 4NUM1 के रूप में||'|'||NUM2 AS KEY2, B 5NUM2 AS NO2, B 6NUM1||'|'||NUM2| |'|'||NUM3 AS KEY3, B 7NUM3 AS NO3, B 8NUM1||'|'||NUM2||'|'||NUM3||'|'||NUM4 AS KEY4 B 9NUM4 AS NO4 B 10FROM B1; B 11 दृश्य C को चुनें C 1कुंजी मान के रूप में, C 2NUM1 को KEY1 के रूप में, C 3NUM1 को NO1, C 4NUM1 के रूप में देखें||'|'||NUM2 AS KEY2, C 5NUM2 AS NO2, C 6NUM1||'|'||NUM2| |'|'||NUM3 AS KEY3, C 7NUM3 AS NO3, C 8NUM1||'|'||NUM2||'|'||NUM3||'|'||NUM4 AS KEY4, C 9NUM4 AS NO4, C 10NUM1||'|'||NUM2||'||NUM3||'|'||NUM4||'|'||NUM5 AS KEY5 C 11NUM5 AS NO5 C 12FROM C1; सी 13 

आप इसे थोड़ा बदल सकते हैं, seeding_table . के बीच जुड़ने के साथ एक और सीटीई होने पर और ordercols_forview_cte और संघ के लिए इसका इस्तेमाल करते हैं। आप पुनरावर्ती CTE (Oracle 11g से) से भी पथ प्राप्त कर सकते हैं:

r (कीवैल्यू, फ्रॉमटेबल, कॉल्सअवेलेबल, आरएनके, पाथ) के रूप में (सेलेक्ट कीवैल्यू, सेटेबल, कॉल्स अवेलेबल, आरएनके, कोल्स अवेलेबल फ्रॉम ऑर्डरकॉल्स_फॉरव्यू जहां आरएनके =1 यूनियन सभी ocfv.keyvalue, ocfv.fromtable, ocfv का चयन करें। colsउपलब्ध, ocfv.rnk, r.path || q'[||'|'||]' || ocfv.colsr से उपलब्ध ocfv.keyvalue =r.keyvalue और ocfv.fromtable =r.fromtable पर ordercols_forview ocfv में शामिल हों और ocfv.rnk =r.rnk + 1)r से * चुनें; 

और फिर इसके बजाय इसका उपयोग कर सकते हैं; यह उस रिकर्सिव सीटीई और सीडिंग टेबल के बीच एक और सीटीई में जुड़ता है जैसा कि ऊपर बताया गया है, लेकिन आप केवल पदानुक्रमित-क्वेरी सीटीई को रिकर्सिव के साथ प्रतिस्थापित करते हैं:

r (कीवैल्यू, फ्रॉमटेबल, कॉल्सअवेलेबल, आरएनके, पाथ) के रूप में (सेलेक्ट कीवैल्यू, सेटेबल, कॉल्स अवेलेबल, आरएनके, कोल्स अवेलेबल फ्रॉम ऑर्डरकॉल्स_फॉरव्यू जहां आरएनके =1 यूनियन सभी ocfv.keyvalue, ocfv.fromtable, ocfv का चयन करें। colsउपलब्ध, ocfv.rnk, r.path || q'[||'|'||]' || ocfv.colsr से उपलब्ध ocfv.keyvalue =r.keyvalue और ocfv.fromtable =r.fromtable पर ordercols_forview ocfv में शामिल हों और ocfv.rnk =r.rnk + 1),combined_cte as (चुनें s.keyvalue, s.view_to_be_created, s.noofcols, r.fromtable, r.colsavailable, r.rnk, r.path से Seeding_table s join r on r। keyvalue =s.keyvalue) 'क्रिएट या रिप्लेस व्यू' चुनें || c.view_to_be_created || टेक्स्ट के रूप में 'जैसा चुनें', c.view_to_be_created, c.rnkसंयुक्त_cte c से c.rnk =1union सभी 'KEYVALUE' का चयन करें, टेक्स्ट के रूप में, c.view_to_be_created, c.rnk + 1 rnk के रूप में joint_cte cजहाँ c.rnk =1union allselect c. पथ || ' कुंजी के रूप में' || सी.आरएनके || मामला जब c.rnk  

जिसका समान परिणाम मिलता है:

  टेक्स्ट वी आरएनके ------------------------------------------- ------------------- - ---------- एक 1कुंजी मान के रूप में एक दृश्य बनाएं या बदलें, एक 2NUM1 कुंजी 1 के रूप में, एक 3NUM1 नंबर 1 के रूप में, A 4NUM1||'|'||NUM2 AS KEY2, A 5NUM2 AS NO2, A 6...NUM1||'|||NUM2||'|'||NUM3 AS KEY3, C 7NUM3 AS NO3, C 8NUM1 ||'|'||NUM2||'|'||NUM3||'|'||NUM4 AS KEY4, C 9NUM4 AS NO4, C 10NUM1||'|'||NUM2||'|'||NUM3 ||'|'||NUM4||'|'||NUM5 AS KEY5 C 11NUM5 AS NO5 सी 12सी1 से; सी 13 



  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. Oracle डेटाबेस के लिए डिफ़ॉल्ट उपयोगकर्ता नाम और पासवर्ड

  3. Oracle डेटाबेस कॉन्फ़िगरेशन सहायक का उपयोग करके खाली डेटाबेस बनाएँ

  4. Oracle:2 तिथियों के बीच HH:MM:SS में समय अंतर की गणना करें

  5. Oracle के तहत बड़े लेनदेन को कैसे संभालें?

© कॉपीराइट http://hi.sqldat.com सर्वाधिकार सुरक्षित