2011-09-06 11 views
7

में LIMIT/OFFSET मैं ओरेकल में एक टेबल अपडेट करने की कोशिश कर रहा हूं और मैं कुछ कठिनाई में भाग रहा हूं। मैं MySQL से अपने कोड को पोर्ट कर रहा हूं और कुछ आदेश जो MySQL अनुमति देता है ओरेकल में समर्थित नहीं है।ओरेकल 11 जी

यहाँ MySQL कोड है:

update table1 t1 set c5 = (select ContractID from table2 t2 where t1.assetid = 
t2.assetid and t1.lastdate >= t2.lastdate and t1.firstdate= t2.firstdate 
order by lastdate asc limit 1 offset 4); 

सबक्वेरी ContractIDS की एक सूची देता है, lastdate के अनुसार क्रमबद्ध और मैं केवल एक विशेष रूप से एक है, इसलिए सीमा 1 ऑफसेट एक्स आदेश चाहते हैं।

समस्या निम्नानुसार है। ओरेकल "सीमा" या "ऑफसेट" कमांड का समर्थन नहीं करता है। राउनम और नेस्टेड प्रश्नों का उपयोग करके सीमा की समस्या के लिए कामकाज हैं, लेकिन ओरेकल 11 जी पार्सर उन्हें UPDATE कमांड में पसंद नहीं करता है।

मुझे एक ऐसी ही समस्या थी जहां मुझे अपडेट कमांड के भीतर सीमा की आवश्यकता थी, लेकिन ऑफ़सेट नहीं। इसे यहां हल किया गया था: MySQL to Oracle Syntax Error (Limit/Offset/Update)

फ्लोरिन गीता विश्लेषणात्मक कार्यों का उपयोग करके एक कामकाज है।

update table1 alf 
    set nextcontractid = 
     (SELECT min(contractid) keep (dense_rank first order by lasttradedate asc) 
     FROM table1copy alf2 
     WHERE alf2.assetid  = alf.assetid 
     AND alf2.lasttradedate > alf.lasttradedate 
    ) 
    where alf.complete = 0 

इस तरीके को मेरे ऊपर या नीचे प्रविष्टि (dense_rank आदेश में एएससी या desc का उपयोग करके) प्राप्त करने के लिए अनुमति देता है, लेकिन मैं अगर मैं दूसरे चाहता था या, ऑफसेट आदेश के लिए एक प्रॉक्सी को खोजने के लिए सक्षम नहीं हूँ तीसरी पंक्ति।

एक अन्य समाधान मैंने कोशिश की है कि नेस्टेड क्वेरी का उपयोग किया जाए। पहली बार राउनम कमांड का उपयोग करके पहली 5 पंक्तियां मिलीं, उन्हें विपरीत तरीके से आदेश दिया, आखिरी चार पंक्तियों से MINUS-ed। यह समाधान विफल रहा क्योंकि ओरेकल पार्सर ने नेस्टेड प्रश्नों में से किसी एक के संदर्भ में बाहरीतम कमांड में किसी तालिका के संदर्भ को समझ नहीं पाया।

(एक ही समस्या मैंने पहले हो रही थी के रूप में: MySQL to Oracle Syntax Error (Limit/Offset/Update))

चुनौती, एक सीमा के साथ ओरेकल में एक का चयन करें बयान चलाने के लिए और ऑफसेट करने के लिए बस नहीं है के रूप में मैं पहले से ही ऐसा कर सकते हैं नेस्ट प्रश्नों के माध्यम से। चयन स्टेटमेंट को अद्यतन कथन में काम करने के लिए चुनौती देना है, क्योंकि कथन वाक्य रचनात्मक रूप से सही है, फिर भी ओरेकल पार्सर उन्हें डीकोड करने में विफल रहता है। अब तक, नेस्टेड प्रश्न (और Google) ने मुझे असफल कर दिया है।

क्या किसी और को भी ऐसी ही समस्याएं आ रही हैं?

+1

आप 12C के लिए नवीनीकरण हैं, तो आप 'तरह अद्यतन table1 t1 सेट सी 5 कुछ = (table2 t2 से ContractID चयन करने में सक्षम हो सकता है:

यहाँ एक प्रक्रियात्मक विधि मैं तुम क्या चाहते हो जाएगा लगता है कि है जहां t1.assetid = t2.assetid और t1.lastdate> = t2.lastdate और t1.firstdate = t2.firstdate lastdate asc offset 4 द्वारा क्रमशः अगली 1 पंक्ति केवल प्राप्त करें); ' – beldaz

+0

संबंधित, और शायद आपके पास उपयोगी है ओरेकल 12 सीआर 1 (या उच्चतर): http://stackoverflow.com/a/26051830/1461424 – Krumia

उत्तर

0

हटाए गए मूल जवाब व्यवहार्य नहीं

मुझे लगता है यह एक एकल एसक्यूएल बयान में संभव होना चाहिए, लेकिन अभी तक एक सहसंबद्ध सबक्वेरी के लिए की जरूरत और विश्लेषणात्मक समारोह के कुछ प्रकार की जरूरत के संयोजन है मैंने जो कुछ भी कोशिश की वह असफल हो गई।

DECLARE 
    CURSOR t IS 
    SELECT LEAD(contractid,4) OVER (PARTITION BY assetid ORDER BY lasttradedate ASC) lead_contractid 
    FROM table1 
    FOR UPDATE; 
BEGIN 
    FOR r IN t LOOP 
    UPDATE table1 SET nextcontractid = r.lead_contractid 
     WHERE CURRENT OF t; 
    END LOOP; 
END; 
+0

नहीं। नेस्टेड प्रश्नों में मैंने पहले उल्लेख की गई सटीक समस्या है। अंतर्निहित क्वेरी यह नहीं समझती कि एएलएफ क्या है, भले ही यह बाहरीतम क्वेरी में निर्दिष्ट है। एसक्यूएल त्रुटि: ओआरए -00 9 04: "एएलएफ"।"ASSETID": अवैध पहचानकर्ता – Brian

+0

@Brian - क्षमा करें, निश्चित रूप से आप सही हैं। मुझे लगता है कि जब तक मैं वास्तव में इसमें भाग नहीं लेता तब तक मैं उस मुद्दे को हमेशा भूल जाता हूं। –

+0

मुझे बिल्कुल यकीन नहीं है कि कोड क्या करता है, लेकिन मैंने आपके द्वारा दिखाए गए अवधारणाओं का उपयोग करके समाधान के साथ आ गया है। (लीड फ़ंक्शन और संग्रहीत प्रक्रिया का उपयोग करके) असल में, मैंने एक संग्रहित प्रक्रिया का उपयोग किया जो कि मेरी तालिका में प्रत्येक प्रविष्टि के माध्यम से एक सूचकांक के रूप में राउनंबर का उपयोग करता है। यह guarantid = उस पंक्ति के एसेटिड ऑर्डर के लिए खोज करता है, और लीड फ़ंक्शन का उपयोग करके अगला अनुबंध प्राप्त करता है। मुझे लगता है कि समाधान की जिस्ट एक संग्रहीत प्रक्रिया का उपयोग करना है। – Brian

संबंधित मुद्दे