दिलचस्प पोस्ट
ब्राउज़र क्या है? प्रोटैक्टर में साइनऑन सिंक्रनाइज़ेशन? JQuery के उपयोग के बिना चिकनी स्क्रॉल स्क्रिप्ट टैग के लिए पैरामीटर कैसे पास करें? दोहरा कर्ली ब्रेस अंकन को क्षणिक रूप से प्रदर्शित करने से पहले angular.js को रोकें / दस्तावेज इंटरपोलेट करें चयनित चेकबॉक्स की संख्या को कैसे सीमित करें? कैसे SqlDataSource का SelectCommand में चर पारित करने के लिए? एकाधिक मार्कर Google मानचित्र एपीआई v3 पते के सरणी से और OVER_QUERY_LIMIT से बचें जबकि पेजलोड पर जीओकोडिंग IE में बंद एनिमेटेड GIF कौन सा तरीका बेहतर प्रदर्शन करता है:। () बनाम। अंक ()> 0? ExpandableListView में विस्तारयोग्य सूचक बदलें एएसपी.नेट एमवीसी के साथ पेजिंग और सॉर्टिंग ग्रिड जेएएसएबी नाममार्ग और उपसर्ग के साथ संयुक्त 'ए और' _ एल के बीच अंतर क्या है? मेरे ऐप में डायरेक्ट "iTunes में दर" लिंक है? QGraphicsScene पर एक बिंदु (माउसक्लिक पर) कैसे आकर्षित करें?

ओरेकल में कई पंक्तियों से कॉलम मूल्यों को जोड़ने के लिए SQL क्वेरी

क्या कई पंक्तियों से कॉलम मूल्यों को जोड़ने के लिए SQL का निर्माण करना संभव होगा?

निम्नलिखित एक उदाहरण है:

टेबल ए

 पीआईडी
 ए
 बी
 सी

टेबल बी

 पीआईडी ​​SEQ Desc

 एक 1 है
 ए 2 एक अच्छा
 एक 3 दिन
 बी 1 अच्छा काम
 सी 1 हाँ
 सी 2 हम कर सकते हैं 
 सी 3 करना 
 सी 4 यह काम!

एसक्यूएल का आउटपुट होना चाहिए –

 PID Desc
 एक अच्छा दिन है।
 बी अच्छा काम
 सी हाँ हम यह काम कर सकते हैं!

तो मूल रूप से बाहर रखा तालिका के लिए Desc कॉलम तालिका बी से SEQ मानों का एक संयोजन है?

एसक्यूएल के साथ कोई मदद?

Solutions Collecting From Web of "ओरेकल में कई पंक्तियों से कॉलम मूल्यों को जोड़ने के लिए SQL क्वेरी"

आपकी क्या संस्करण के आधार पर कुछ तरीके हैं – स्ट्रिंग समेकन तकनीकों पर ओरेकल दस्तावेज़ देखें। एक बहुत ही आम एक LISTAGG का उपयोग करने के लिए है:

 SELECT pid, LISTAGG(Desc, ' ') WITHIN GROUP (ORDER BY seq) AS desc FROM B GROUP BY pid; 

फिर आप जो pids चाहते हैं उसे चुनने के लिए A शामिल हों।

नोट: बॉक्स के बाहर, LISTAGG केवल VARCHAR2 कॉलम के साथ ठीक से काम करता है।

एक XMLAGG फ़ंक्शन भी है, जो संस्करण 11.2 से पहले काम करता है। क्योंकि WM_CONCAT को undocumented और Oracle द्वारा असमर्थित है , इसलिए यह उत्पादन प्रणाली में इसका उपयोग न करने की अनुशंसा है

XMLAGG साथ आप निम्न कर सकते हैं:

 SELECT XMLAGG(XMLELEMENT(E,ename||',')).EXTRACT('//text()') "Result" FROM employee_names 

यह क्या होता है

  • एक XML तत्व में employee_names तालिका से टैग ई के साथ ename कॉलम (एक कॉमा के साथ ename ) के मूल्य डालें
  • इस का पाठ निकालें
  • समग्र XML (इसे जोड़ना)
  • परिणामस्वरूप कॉलम "परिणाम" को कॉल करें

एसक्यूएल मॉडल खंड के साथ:

 SQL> select pid 2 , ltrim(sentence) sentence 3 from ( select pid 4 , seq 5 , sentence 6 from b 7 model 8 partition by (pid) 9 dimension by (seq) 10 measures (descr,cast(null as varchar2(100)) as sentence) 11 ( sentence[any] order by seq desc 12 = descr[cv()] || ' ' || sentence[cv()+1] 13 ) 14 ) 15 where seq = 1 16 / P SENTENCE - --------------------------------------------------------------------------- A Have a nice day B Nice Work. C Yes we can do this work! 3 rows selected. 

मैंने इसके बारे में यहां लिखा है । और अगर आप ओटीएन-धागा के लिंक का पालन करते हैं तो आपको प्रदर्शन की तुलना सहित कुछ और मिलेगा।

सादर,
रोब।

ऑरेकल 11 जी रिलीज 2 में लिस्टग एनालिटिक फंक्शन पेश किया गया था, जिससे यह कुल स्ट्रिंग्स के लिए आसान हो गया था। यदि आप 11g रिलीज़ 2 का उपयोग कर रहे हैं तो आपको स्ट्रिंग एकत्रीकरण के लिए इस फ़ंक्शन का उपयोग करना चाहिए। कृपया स्ट्रिंग संयोजन के बारे में अधिक जानकारी के लिए यूआरएल देखें।

http://www.oracle-base.com/articles/misc/StringAggregationTechniques.php

स्ट्रिंग समापन

एक चुनिंदा क्वेरी चलाने से पहले इसे चलाएं:

SET SERVEROUT ON SIZE 6000

 SELECT XMLAGG(XMLELEMENT(E,SUPLR_SUPLR_ID||',')).EXTRACT('//text()') "SUPPLIER" FROM SUPPLIERS; 

जिन लोगों को ओरेकल 9i (या उससे पहले) का उपयोग कर इस समस्या को हल करना है, आपको शायद SYS_CONNECT_BY_PATH का उपयोग करना होगा, क्योंकि LISTAGG उपलब्ध नहीं है।

ओपी का जवाब देने के लिए, निम्नलिखित प्रश्न तालिका ए से पीआईडी ​​प्रदर्शित करेगा और तालिका बी से सभी डीईएससी कॉलम को जोड़ देगा:

 SELECT pid, SUBSTR (MAX (SYS_CONNECT_BY_PATH (description, ', ')), 3) all_descriptions FROM ( SELECT ROW_NUMBER () OVER (PARTITION BY pid ORDER BY pid, seq) rnum, pid, description FROM ( SELECT a.pid, seq, description FROM table_a a, table_b b WHERE a.pid = b.pid(+) ) ) START WITH rnum = 1 CONNECT BY PRIOR rnum = rnum - 1 AND PRIOR pid = pid GROUP BY pid ORDER BY pid; 

ऐसे उदाहरण भी हो सकते हैं जहां एक मेज पर चाबियाँ और मूल्य शामिल हैं। निम्नलिखित क्वेरी का उपयोग किया जा सकता है जहां कोई टेबल ए नहीं है, और केवल तालिका बी मौजूद है:

 SELECT pid, SUBSTR (MAX (SYS_CONNECT_BY_PATH (description, ', ')), 3) all_descriptions FROM ( SELECT ROW_NUMBER () OVER (PARTITION BY pid ORDER BY pid, seq) rnum, pid, description FROM ( SELECT pid, seq, description FROM table_b ) ) START WITH rnum = 1 CONNECT BY PRIOR rnum = rnum - 1 AND PRIOR pid = pid GROUP BY pid ORDER BY pid; 

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


वैकल्पिक रूप से: कई बार हो सकते हैं जब आप एक संपूर्ण तालिका से सभी पंक्तियों को एक पंक्ति में जोड़ना चाहते हैं

मुख्य विचार यहां एकत्रित किए जाने वाले वर्णन के समूह के लिए एक कृत्रिम मूल्य का उपयोग कर रहे हैं।

निम्नलिखित क्वेरी में, निरंतर स्ट्रिंग '1' का उपयोग किया जाता है, लेकिन कोई भी मान काम करेगा:

 SELECT SUBSTR (MAX (SYS_CONNECT_BY_PATH (description, ', ')), 3) all_descriptions FROM ( SELECT ROW_NUMBER () OVER (PARTITION BY unique_id ORDER BY pid, seq) rnum, description FROM ( SELECT '1' unique_id, b.pid, b.seq, b.description FROM table_b b ) ) START WITH rnum = 1 CONNECT BY PRIOR rnum = rnum - 1; 

व्यक्तिगत समापन विवरण को खंड द्वारा खंड में पुन: क्रम दिया जा सकता है।

इस पृष्ठ पर कई अन्य उत्तरों ने भी बहुत उपयोगी संदर्भ का उल्लेख किया है: https://oracle-base.com/articles/misc/string-aggregation-techniques

LISTAGG का उपयोग सबसे अधिक व्यावहारिक होता है और यह एक अपवाद के साथ सर्वश्रेष्ठ प्रदर्शन को बचाता है, जब आदेश की आवश्यकता नहीं होती है। यहां अधिक विवरण: http://www.oracle-developer.net/display.php?id=515

मैं LISTAGG का उपयोग कर रहा हूं लेकिन फ़र्शियन स्ट्रिंग के लिए इस स्ट्रिंग को वापस लौटाओ!

मेरी क्वेरी:

 SELECT listagg(DESCRIPTION,' , ') within group (order by DESCRIPTION) FROM B_CEREMONY 

परिणाम:

 'A7'1 , ,4F 

क्रिप्या मेरि सहायता करे।

वाह इस समाधान पर काम किया है:

 SELECT listagg(convert(DESCRIPTION, 'UTF8', 'AL16UTF16'),' , ') within group (order by DESCRIPTION) FROM B_CEREMONY; 

इस कोड को आज़माएं:

  SELECT XMLAGG(XMLELEMENT(E,fieldname||',')).EXTRACT('//text()') "FieldNames" FROM FIELD_MASTER WHERE FIELD_ID > 10 AND FIELD_AREA != 'NEBRASKA'; 

चयन में जहां आप अपने समालोचना चाहते हैं, एक एसक्यूएल फ़ंक्शन कॉल करें।

उदाहरण के लिए:

 select PID, dbo.MyConcat(PID) from TableA; 

फिर एसक्यूएल फ़ंक्शन के लिए:

 Function MyConcat(@PID varchar(10)) returns varchar(1000) as begin declare @x varchar(1000); select @x = isnull(@x +',', @x, @x +',') + Desc from TableB where PID = @PID; return @x; end 

फ़ंक्शन हेडर वाक्यविन्यास गलत हो सकता है, लेकिन सिद्धांत काम करता है।

या ओरेकल STRAGG (स्तंभ) फ़ंक्शन।

मुझे कहना होगा, इस तरह की प्रक्रिया बहुत सीमित है … यदि आप क्षेत्र चौड़ाई या डिस्प्ले चौड़ाई से अधिक हो …