दिलचस्प पोस्ट
std :: स्ट्रिंग स्वरूपण जैसे sprintf स्क्रॉल करते समय रीसायकल दृश्य के दृश्यमान दृश्य प्राप्त करें बंडल कायल का मतलब क्या है? मैं PHP में एक वेब पेज का HTML कोड कैसे प्राप्त करूं? पास-थ्रू माउस इवेंट्स को पेरेंट कंट्रोल Node.js के साथ एक फ़ाइल कैसे डाउनलोड करें (तीसरे पक्ष के पुस्तकालयों का उपयोग किए बिना)? JSONP और jQuery के साथ PUT / POST / DELETE का उपयोग करना HashSet <T> और सूची <टी> के बीच अंतर क्या है? एंड्रॉइड इन्टेंट में यूआरएल को उत्तर दें एसक्यूएल सर्वर sp_msforeachtable उपयोग केवल उन तालिकाओं का चयन करने के लिए जो कुछ स्थिति से मेल खाते हैं क्रोम डेवलपर टूल में जावास्क्रिप्ट को अक्षम कैसे करें स्कला में कार्य को परिभाषित करने के दो तरीके अंतर क्या है? कैसे एक unordered सूची आइटम से indentation को दूर करने के लिए? गिट 1.6.4 बीटा पर विंडोज (एमएससीजीट) – यूनिक्स या डॉस लाइन समाप्ति मैं Win32 ऐप में डिबग आउटपुट विंडो को कैसे प्रिंट करूं?

ओरेकल में खंड में 1000 से अधिक मूल्य कैसे डालें

क्या एक स्थिर इन खंड में 1000 वस्तुओं के ओरेकल 10 जी सीमा के आसपास पहुंचने का कोई तरीका है? मेरे पास कई आईडी की एक सीमांकित सीमांकित सूची है जिसे मैं एक इन खंड में उपयोग करना चाहता हूं, कभी-कभी यह सूची 1000 आइटम से अधिक हो सकती है, उस बिंदु पर ऑरेकल एक त्रुटि को फेंकता है क्वेरी इस के समान है …

select * from table1 where ID in (1,2,3,4,...,1001,1002,...) 

वेब के समाधान से एकत्रित समाधान "ओरेकल में खंड में 1000 से अधिक मूल्य कैसे डालें"

एक अस्थायी तालिका में मान डालें और फिर एक ऐसा चयन करें जहां id में (प्रलोभन से आईडी चुनें)

आप निम्न प्रपत्र का उपयोग करने का प्रयास कर सकते हैं:

 select * from table1 where ID in (1,2,3,4,...,1000) union all select * from table1 where ID in (1001,1002,...) 

मुझे पूरा यकीन है कि आप आईएनएस या आईएनएस का इस्तेमाल करते हुए मूल्यों को विभाजित कर सकते हैं:

 select * from table1 where ID in (1,2,3,4,...,1000) or ID in (1001,1002,...,2000) 
 select column_X, ... from my_table where ('magic', column_X ) in ( ('magic', 1), ('magic', 2), ('magic', 3), ('magic', 4), ... ('magic', 99999) ) ... 

आप पहली जगह से आईडी की सूची कहां प्राप्त करते हैं? चूंकि वे आपके डेटाबेस में आईडी हैं, क्या वे कुछ पिछली क्वेरी से आए हैं?

जब मैंने इसे अतीत में देखा है, तो इसका कारण यह है: –

  1. एक संदर्भ तालिका लापता है और नई तालिका जोड़ने के लिए सही तरीके से होगा, उस तालिका पर एक विशेषता डालें और उसके साथ जुड़ें
  2. आईडी की एक सूची को डेटाबेस से निकाला जाता है, और उसके बाद के बाद के एसक्यूएल कथन (शायद बाद में या किसी दूसरे सर्वर पर या जो भी) में इस्तेमाल किया जाता है। इस मामले में, इसका उत्तर डेटाबेस से इसे कभी नहीं निकालने का है या तो एक अस्थायी तालिका में स्टोर करें या बस एक क्वेरी लिखें।

मुझे लगता है कि इस कोड को दोबारा करने के लिए बेहतर तरीके हो सकते हैं जो सिर्फ इस एसक्यूएल कथन को काम करने के लिए मिल रहा है। यदि आप अधिक विवरण प्रदान करते हैं तो आपको कुछ विचार मिल सकते हैं।

उपयोग करें … तालिका से (…:

 create or replace type numbertype as object (nr number(20,10) ) / create or replace type number_table as table of numbertype / create or replace procedure tableselect ( p_numbers in number_table , p_ref_result out sys_refcursor) is begin open p_ref_result for select * from employees , (select /*+ cardinality(tab 10) */ tab.nr from table(p_numbers) tab) tbnrs where id = tbnrs.nr; end; / 

यह दुर्लभ मामलों में से एक है जहां आपको संकेत की आवश्यकता है, अन्यथा ऑरेकल कॉलम आईडी पर सूचकांक का उपयोग नहीं करेगा। इस दृष्टिकोण के फायदों में से एक यह है कि ओरेकल को बार-बार पूछताछ करने की आवश्यकता नहीं है अस्थायी तालिका का उपयोग करना अधिकतर धीमी है।

संपादित करें 1 प्रक्रिया सरल (jimmyorr के लिए धन्यवाद) + उदाहरण

 create or replace procedure tableselect ( p_numbers in number_table , p_ref_result out sys_refcursor) is begin open p_ref_result for select /*+ cardinality(tab 10) */ emp.* from employees emp , table(p_numbers) tab where tab.nr = id; end; / 

उदाहरण:

 set serveroutput on create table employees ( id number(10),name varchar2(100)); insert into employees values (3,'Raymond'); insert into employees values (4,'Hans'); commit; declare l_number number_table := number_table(); l_sys_refcursor sys_refcursor; l_employee employees%rowtype; begin l_number.extend; l_number(1) := numbertype(3); l_number.extend; l_number(2) := numbertype(4); tableselect(l_number, l_sys_refcursor); loop fetch l_sys_refcursor into l_employee; exit when l_sys_refcursor%notfound; dbms_output.put_line(l_employee.name); end loop; close l_sys_refcursor; end; / 

यह आउटपुट होगा:

 Raymond Hans 

मैं यहां एक समाधान की तलाश में घाव लगा रहा हूं।

उच्च अंत संख्या वाले मदों के आधार पर आपको इसके बारे में पूछने की ज़रूरत है, और अपने आइटम को संभालने के लिए अद्वितीय है, आप अपनी क्वेरी को 1000 आइटम के बैचों के प्रश्नों में विभाजित कर सकते हैं, और परिणामों को इसके अंत में (स्यूडोकोड यहाँ) जोड़ सकते हैं:

 //remove dupes items = items.RemoveDuplicates(); //how to break the items into 1000 item batches batches = new batch list; batch = new batch; for (int i = 0; i < items.Count; i++) { if (batch.Count == 1000) { batches.Add(batch); batch.Clear() } batch.Add(items[i]); if (i == items.Count - 1) { //add the final batch (it has < 1000 items). batches.Add(batch); } } // now go query the db for each batch results = new results; foreach(batch in batches) { results.Add(query(batch)); } 

परिदृश्य में यह एक अच्छा व्यापार-बंद हो सकता है, जहां आपके पास 1000 से ज्यादा आइटम नहीं होते हैं – जैसा कि 1000 से अधिक आइटम होने पर आपका "उच्च अंत" किनारे-मामला परिदृश्य होगा उदाहरण के लिए, आपके पास 1500 आइटम हैं, तो (1000, 500) की दो क्वेरी इतनी खराब नहीं होगी यह यह भी मानता है कि प्रत्येक क्वेरी विशेष रूप से अपने दाहिनी ओर से महंगा नहीं है

यह उचित नहीं होगा यदि आपकी अपेक्षाकृत वस्तुओं की अपेक्षाकृत संख्या अधिक बड़ी हो – कहते हैं, 100000 में – 100 प्रश्नों की आवश्यकता होती है यदि हां, तो आपको ऊपर दिए गए वैश्विक अस्थायी तालिकाओं समाधान का उपयोग करके सबसे अधिक "सही" समाधान के रूप में अधिक गंभीरता से देखना चाहिए। इसके अलावा, यदि आपकी वस्तुओं अद्वितीय नहीं हैं, तो आपको अपने बैचों में भी डुप्लिकेट परिणाम को हल करना होगा।

हां, ओरेकल के लिए बहुत अजीब स्थिति

यदि आप IN खंड के अंदर 2000 आईडी निर्दिष्ट करते हैं, तो यह विफल हो जाएगा यह विफल रहता है:

 select ... where id in (1,2,....2000) 

लेकिन अगर आप बस दूसरे आईडी (उदाहरण के लिए अस्थायी तालिका) में 2000 आईडी डालते हैं, तो यह काम करता है:

 select ... where id in (select userId from temptable_with_2000_ids ) 

आप क्या कर सकते हैं, वास्तव में रिकॉर्ड को बहुत सारे 1000 रिकॉर्ड में विभाजित कर सकते हैं और समूह द्वारा समूह को निष्पादित कर सकते हैं।

IN खंड का उपयोग करने के बजाय, क्या आप दूसरे तालिका के साथ JOIN का उपयोग करने की कोशिश कर सकते हैं, जो आईडी को ला रहा है इस तरह हमें सीमा के बारे में चिंता करने की ज़रूरत नहीं है मेरे पक्ष से सिर्फ एक विचार

यहां कुछ पर्ल कोड है जो एक इनलाइन दृश्य बनाकर सीमा के आसपास काम करने का प्रयास करता है और उसके बाद से चयन कर रहा है। बयान पाठ को प्रत्येक आइटम को ड्यूअल से व्यक्तिगत रूप से चुनने के बजाय प्रत्येक बारह वस्तुओं की पंक्तियों का उपयोग करके संकुचित किया जाता है, फिर एक साथ सभी स्तंभों को मिलाकर असम्पीडित किया जाता है। यूनिसेन या यूनियन सभी को डीकंप्रेसन में कोई अंतर नहीं होना चाहिए क्योंकि यह सब एक अंदर है जो इसके विरुद्ध किसी भी तरह से जुड़ने से पहले विशिष्टता लागू करेगा, लेकिन संपीड़न में, यूनियन सब बहुत अनावश्यक तुलना को रोकने के लिए उपयोग किया जाता है। चूंकि डेटा जो मैं फ़िल्टर कर रहा हूं वह सभी पूर्ण संख्या हैं, उद्धृत कोई समस्या नहीं है

 # # generate the innards of an IN expression with more than a thousand items # use English '-no_match_vars'; sub big_IN_list{ @_ < 13 and return join ', ',@_; my $padding_required = (12 - (@_ % 12)) % 12; # get first dozen and make length of @_ an even multiple of 12 my ($a,$b,$c,$d,$e,$f,$g,$h,$i,$j,$k,$l) = splice @_,0,12, ( ('NULL') x $padding_required ); my @dozens; local $LIST_SEPARATOR = ', '; # how to join elements within each dozen while(@_){ push @dozens, "SELECT @{[ splice @_,0,12 ]} FROM DUAL" }; $LIST_SEPARATOR = "\n union all\n "; # how to join @dozens return <<"EXP"; WITH t AS ( select $a A, $b B, $c C, $d D, $e E, $f F, $g G, $h H, $i I, $j J, $k K, $l L FROM DUAL union all @dozens ) select A from t union select B from t union select C from t union select D from t union select E from t union select F from t union select G from t union select H from t union select I from t union select J from t union select K from t union select L from t EXP } 

ऐसा एक का उपयोग करेगा:

 my $bases_list_expr = big_IN_list(list_your_bases()); $dbh->do(<<"UPDATE"); update bases_table set belong_to = 'us' where whose_base in ($bases_list_expr) UPDATE 

इसके बजाय SELECT * FROM table1 WHERE ID IN (1,2,3,4,...,1000);

इसे इस्तेमाल करो :

SELECT * FROM table1 WHERE ID IN (SELECT rownum AS ID FROM dual connect BY level <= 1000);

* ध्यान रखें कि आपको यह सुनिश्चित करने की आवश्यकता है कि यह ID किसी अन्य विदेशी आईडीएस का उल्लेख नहीं करता है, अगर यह निर्भरता है यह सुनिश्चित करने के लिए कि केवल मौजूदा आईडी उपलब्ध हैं:

SELECT * FROM table1 WHERE ID IN (SELECT distinct(ID) FROM tablewhereidsareavailable);

चियर्स