दिलचस्प पोस्ट
वेबसॉट्स हाइबी 08+ में डेटा फ़्रेम का निर्माण कैसे करें? आईफोन छवि खींच (तिरछा) मैं फॉर्म के क्लीन () विधि में अनुरोध ऑब्जेक्ट या अन्य वैरिएबल का उपयोग कैसे करूं? UITextView में पंक्ति ऊंचाई सेट करें क्या यह धागा.बोर्ट () सामान्य और सुरक्षित है? जावास्क्रिप्ट: कैरेट को आखिरी चरित्र में ले जाएं एसक्यूएल ग्रुप द्वारा कुल कार्य के साथ केस स्टेटमेंट एएसपी.एक्स गतिशील रूप से ईवेंट हैंडलर के साथ बटन केवल स्तंभों की सीमित संख्या को पढ़ें कैसे एक बटन क्लिक पर ListView से वस्तुओं को गतिशील हटायें? वेक्टर के लिए वैकल्पिक <bool> एंड्रॉइड: फोन दोहरी सिम है या नहीं यह जांचें जावा में डिफ़ॉल्ट वर्णसेट / एन्कोडिंग कैसे खोजें? Argv / argc में स्ट्रिंग पार्स करें PHP पृष्ठ से GMail SMTP सर्वर का उपयोग करके ईमेल भेजें

अल्पविराम सीमांकित सूची SQL सर्वर बनाने के लिए यह क्वेरी क्या करती है?

मैंने इस क्वेरी को एक तालिका से सीमांकित सूची बनाने के लिए Google की मदद से लिखा है लेकिन मुझे इस क्वेरी से कुछ नहीं समझा था।

क्या कोई मुझे समझा सकता है कि क्या हो रहा है

SELECT E1.deptno, allemp = Replace ((SELECT E2.ename AS 'data()' FROM emp AS e2 WHERE e1.deptno = e2.DEPTNO FOR xml PATH('')), ' ', ', ') FROM EMP AS e1 GROUP BY DEPTNO; 

मुझे परिणाम देता है

 10 CLARK, KING, MILLER 20 SMITH, JONES, SCOTT, ADAMS, FORD 30 ALLEN, WARD, MARTIN, BLAKE, TURNER, JAMES 

वेब के समाधान से एकत्रित समाधान "अल्पविराम सीमांकित सूची SQL सर्वर बनाने के लिए यह क्वेरी क्या करती है?"

इसे समझा जाने का सबसे आसान तरीका यह है कि कैसे वास्तविक XML के FOR XML PATH काम करता है एक सरल तालिका Employee कल्पना करो:

 EmployeeID Name 1 John Smith 2 Jane Doe 

आप उपयोग कर सकते हैं

 SELECT EmployeeID, Name FROM emp.Employee FOR XML PATH ('Employee') 

इस प्रकार XML बनायेगा

 <Employee> <EmployeeID>1</EmployeeID> <Name>John Smith</Name> </Employee> <Employee> <EmployeeID>2</EmployeeID> <Name>Jane Doe</Name> </Employee> 

PATH से 'कर्मचारी' को हटाने से बाहरी एक्सएमएल टैग को हटा दिया जाता है ताकि ये प्रश्न हो सके:

 SELECT Name FROM Employee FOR XML PATH ('') 

बनाना होगा

  <Name>John Smith</Name> <Name>Jane Doe</Name> 

आप जो कर रहे हैं वह आदर्श नहीं है, स्तंभ नाम 'डेटा ()' एक एसक्यूएल त्रुटि को बल देता है क्योंकि यह एक XML टैग बनाने का प्रयास कर रहा है जो एक कानूनी टैग नहीं है, इसलिए निम्न त्रुटि उत्पन्न होती है:

कॉलम का नाम 'डेटा ()' XML के लिए आवश्यक एक अमान्य XML पहचानकर्ता होता है; '(' (0x0028) गलती पर पहला अक्षर है

सहसंबद्ध subquery इस त्रुटि छुपाता है और बस कोई टैग के साथ एक्सएमएल उत्पन्न करता है:

 SELECT Name AS [Data()] FROM Employee FOR XML PATH ('') 

बनाता है

 John Smith Jane Doe 

फिर आप अल्पविराम के साथ रिक्त स्थान की जगह ले रहे हैं, काफी आत्म व्याख्यात्मक …

अगर मैं आप थे तो मैं थोड़ा प्रश्न पूछूंगा:

 SELECT E1.deptno, STUFF(( SELECT ', ' + E2.ename FROM emp AS e2 WHERE e1.deptno = e2.DEPTNO FOR XML PATH('') ), 1, 2, '') FROM EMP AS e1 GROUP BY DEPTNO; 

कोई कॉलम उपनाम नहीं होने पर कोई भी एक्सएमएल टैग नहीं बनाया जाता है, और चयनित क्वेरी के भीतर अल्पविराम को जोड़ते हुए इसका अर्थ है कि रिक्त स्थान के साथ कोई भी नाम त्रुटियों का कारण नहीं होगा, STUFF पहले अल्पविराम और स्थान को निकाल देगा।

परिशिष्ट

केएम ने एक टिप्पणी में क्या कहा है, इस बारे में विस्तृत करने के लिए, जैसा कि ऐसा लगता है कि कुछ और विचार मिल रहे हैं, एक्सएमएल वर्णों से बचने का सही तरीका इस्तेमाल किया जाएगा .value निम्नानुसार है:

 SELECT E1.deptno, STUFF(( SELECT ', ' + E2.ename FROM emp AS e2 WHERE e1.deptno = e2.DEPTNO FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 2, '') FROM EMP AS e1 GROUP BY DEPTNO; 

कदम से अलग कदम उठाइए – अंदर से बाहर।

चरण 1:

सबसे सरल क्वेरी चलाएं और देखें कि यह क्या पैदा करता है:

 SELECT E2.ename AS 'data()' FROM emp AS e2 WHERE e2.DEPTNO = 10 FOR XML PATH('') 

आपको एक आउटपुट कुछ मिलना चाहिए:

 CLARK KING MILLER 

चरण 2:

प्रतिस्थापन बस के साथ रिक्त स्थान की जगह , – इस प्रकार अपने उत्पादन में बदल

 CLARK, KING, MILLER 

चरण 3:

बाहरी क्वेरी को deptno मूल्य मिलता है – साथ ही आंतरिक क्वेरी से परिणाम – और आपके अंतिम परिणाम का उत्पादन करता है।

बाहरी क्वेरी विभाग संख्याओं की एक सूची प्राप्त करती है, और बाद में प्रत्येक विभाग के लिए सबक्वियर चलाया जाता है ताकि वह विभाग के सभी नाम वापस कर सके। आउटपुट को एक पंक्ति कॉमा से अलग किए गए सूची में प्रारूपित करने के लिए सबक्ज़री FORME XML कथन का उपयोग करता है।

SQL सर्वर 2017 नए STRING_AGG साथ यह बहुत आसान बना देता है हाल ही में इस पोस्ट में आया था और मेरी स्ट्रिंग स्विच / एक्स स्ट्रिंग के लिए नई स्ट्रिंग फ़ंक्शन का उपयोग करने के लिए। इसके अलावा एक अतिरिक्त JOIN / SUBQUERYand XML के लिए ओवरहेड ( और अजीब-एन्कोडिंग मुद्दों ) और एसक्यूएल की व्याख्या करने के लिए मुश्किल से बचा जाता है।

 SELECT E1.deptno, STRING_AGG(E1.ename, ', ') AS allemp FROM EMP AS e1 GROUP BY DEPTNO; 

नोट : एसक्यूएल सीमांकित डेटा के साथ काम करने के लिए समकक्ष भी देखें STRING_SPLIT बहुत आसान है।