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

देखें अन्योन्याश्रय तर्क की आवश्यकता है:मॉडल के बिना संभव है?

आप पुनरावर्ती सबक्वेरी फैक्टरिंग का उपयोग कर सकते हैं (एक पुनरावर्ती सीटीई के रूप में भी जाना जाता है):

with tmp as (
  select t.*,
    row_number() over (order by t.id) as rn
  from t
),
r (id, n, x, y, rn) as (
  select id, n, 0, 0, rn
  from tmp
  where rn = 1
  union all
  select tmp.id, tmp.n, r.y - 1, (tmp.n * 2) + r.y - 1, tmp.rn
  from r
  join tmp on tmp.rn = r.rn + 1
)
select id, n, x, y
from r
order by rn;

        ID          N          X          Y
---------- ---------- ---------- ----------
         2          0          0          0 
         3          1         -1          1 
         5          1          0          2 
         7          2          1          5 
        11          3          4         10 
        13          5          9         19 
        17          8         18         34 
        19         13         33         59 

SQL Fiddle

यह मूल रूप से आपके मैनुअल चरणों के माध्यम से चल रहा है। एंकर सदस्य आपका पहला मैनुअल कदम है, x . सेटिंग और y पहली पंक्ति के लिए दोनों शून्य। पुनरावर्ती सदस्य तब आपके द्वारा निर्दिष्ट गणना करता है। (आप नए परिकलित x . का संदर्भ नहीं ले सकते उस पंक्ति के y . की गणना करते समय मान , इसलिए आपको इसे (tmp.n * 2) + r.y - 1 के रूप में दोहराना होगा ) rn अगली पंक्ति को ढूंढना आसान बनाते हुए पंक्तियों के क्रम को आईडी के आधार पर रखना है - ताकि आप rn + 1 की तलाश कर सकें अगले उच्चतम आईडी मान को सीधे खोजने के बजाय।

आपके नमूना डेटा के साथ कोई महत्वपूर्ण प्रदर्शन अंतर नहीं है, लेकिन एक हजार पंक्तियों को जोड़ने के साथ मॉडल क्लॉज में लगभग 5 सेकंड लगते हैं और पुनरावर्ती CTE में लगभग 1 सेकंड लगता है; एक और हजार पंक्तियों के साथ मॉडल ~ 20 सेकंड लेता है और सीटीई ~ 3 सेकंड लेता है; एक और हजार पंक्तियों के साथ मॉडल ने ~ 40 सेकंड और सीटीई ने ~ 6 सेकंड का समय लिया; और एक और हजार पंक्तियों के साथ (कुल मिलाकर 4,008) मॉडल ने ~ 75 सेकंड और सीटीई ने ~ 10 सेकंड का समय लिया। (मैं उससे अधिक पंक्तियों वाले मॉडल संस्करण की प्रतीक्षा में ऊब गया था; 10,000 के साथ पांच मिनट के बाद इसे मार डाला)। मैं वास्तव में यह नहीं कह सकता कि यह आपके वास्तविक डेटा के साथ कैसा प्रदर्शन करेगा, लेकिन उस आधार पर, यह शायद कोशिश करने लायक है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. संग्रहीत कार्यविधि निष्पादित करते समय नोड-ओरेक्लेडब त्रुटि NJS-012

  2. ऑरैकल में लोब सेगमेंट (SYS_LOB) को समझना?

  3. ओरेकल/पीएलएसक्यूएल में भागों से डेटाटाइम कैसे बनाएं?

  4. डिफ़ॉल्ट मानों के साथ एकाधिक तालिकाओं को पिवट करें

  5. हाइबरनेट में एक समग्र प्राथमिक कुंजी में एक आईडी को स्वत:कैसे बढ़ाया जाए?