दिलचस्प पोस्ट
बाइनरी बम – चरण 4 आर में एक सूची के सभी विशिष्ट क्रमपरिवर्तन उत्पन्न करना 1 डी सरणी पर एक 2 डी सरणी को मैप करें MVVM पासिंग इवेंटएआरजीज़ कमान पैरामीटर के रूप में जावा: चेक किए गए अनचेक अपवाद स्पष्टीकरण बनाम गिट – एक SHA1 से एक फ़ाइल नाम ढूंढना किसी सामग्री में सम्मिलित किए गए तत्व के ठीक बाद कैरेट स्थिति सेट करेंयोग्य डिवा UITableView की पृष्ठभूमि को स्पर्श करके कीबोर्ड को खारिज करें सी # स्थिर सदस्य "उत्तराधिकार" – यह सब क्यों मौजूद है? UIBezierPath कोड उत्पन्न UIView पर आरेखण क्या यह शा 1 को उलटा देना संभव है? टुकड़ों के अंदर XML onClick का उपयोग करके बटन क्लिक कैसे नियंत्रित करें एएसपी-क्लासिक के साथ फाइल कैसे अपलोड करें जांचें कि क्या स्ट्रिंग में एक सूची (तारों की) से एक तत्व है शब्दों को जावास्क्रिप्ट नंबर

सम्मिलित करने के लिए इष्टतम तरीका / समस्त स्ट्रिंग

मुझे अलग-अलग पंक्तियों से स्ट्रिंग को एक पंक्ति में एकत्र करने का एक तरीका मिल रहा है मैं इसे कई अलग-अलग जगहों में करने के लिए देख रहा हूं, इसलिए यह सुविधाजनक बनाने के लिए एक समारोह होने पर यह अच्छा होगा मैंने COALESCE और FOR XML समाधान का उपयोग करने की कोशिश की है, लेकिन वे इसे मेरे लिए कटौती नहीं करते हैं

स्ट्रिंग एकत्रीकरण ऐसा कुछ करेगा:

 id | Name Result: id | Names -- - ---- -- - ----- 1 | Matt 1 | Matt, Rocks 1 | Rocks 2 | Stylus 2 | Stylus 

मैंने COALESCE और FOR XML लिए प्रतिस्थापन के रूप में सीएलआर-परिभाषित समेकित कार्यों पर एक नज़र लिया है, लेकिन जाहिरा तौर पर एसक्यूएल एज़्योर सीएलआर-परिभाषित सामान का समर्थन नहीं करता है , जो मेरे लिए एक दर्द है क्योंकि मुझे पता है कि इसका उपयोग करने में सक्षम होने से इसका समाधान होगा मेरे लिए बहुत सारी समस्याएं

क्या कोई भी संभव समाधान, या इसी तरह की इष्टतम विधि (जो सीएलआर के रूप में इष्टतम नहीं हो सकती है, लेकिन हे मैं जो ले सकता हूं वह ले जायेगा) कि मैं अपना सामान एकत्रित करने के लिए उपयोग कर सकता हूं?

वेब के समाधान से एकत्रित समाधान "सम्मिलित करने के लिए इष्टतम तरीका / समस्त स्ट्रिंग"

उपाय

इष्टतम की परिभाषा भिन्न हो सकती है, लेकिन ये है कि नियमित रूप से ट्रांसएक्ट एसक्यूएल का इस्तेमाल करते हुए अलग-अलग पंक्तियों से स्ट्रिंग को जोड़ना है, जिसको नीला में ठीक काम करना चाहिए।

 ;WITH Partitioned AS ( SELECT ID, Name, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Name) AS NameNumber, COUNT(*) OVER (PARTITION BY ID) AS NameCount FROM dbo.SourceTable ), Concatenated AS ( SELECT ID, CAST(Name AS nvarchar) AS FullName, Name, NameNumber, NameCount FROM Partitioned WHERE NameNumber = 1 UNION ALL SELECT P.ID, CAST(C.FullName + ', ' + P.Name AS nvarchar), P.Name, P.NameNumber, P.NameCount FROM Partitioned AS P INNER JOIN Concatenated AS C ON P.ID = C.ID AND P.NameNumber = C.NameNumber + 1 ) SELECT ID, FullName FROM Concatenated WHERE NameNumber = NameCount 

व्याख्या

दृष्टिकोण तीन चरणों तक फोड़े:

  1. PARTITION OVER और PARTITION ग्रुपिंग का उपयोग करके और संयोजन के लिए आवश्यकतानुसार क्रमबद्ध करें। परिणाम Partitioned सीटीई है। बाद में परिणाम को फ़िल्टर करने के लिए हम प्रत्येक विभाजन में पंक्तियों की गिनती रखते हैं

  2. NameNumber ( NameNumber ) का प्रयोग करके पंक्ति संख्याओं ( NameNumber कॉलम) के माध्यम से NameNumber कॉलम में Name मान जोड़ना।

  3. सभी परिणामों को फ़िल्टर करें, लेकिन उच्चतम नाम वाले NameNumber

कृपया ध्यान रखें कि इस क्वेरी के पूर्वानुमान के लिए, दोनों को समूहिंग (उदाहरण के लिए, आपके परिदृश्य पंक्तियों में एक ही ID साथ जोड़ दिया जाता है) और सॉर्टिंग (मुझे लगता है कि आप बस वर्णनात्मक रूप से संयोजन से पहले स्ट्रिंग सॉर्ट करते हैं) को परिभाषित करना है।

मैंने जल्दी से SQL सर्वर 2012 पर निम्न डेटा के समाधान का परीक्षण किया है:

 INSERT dbo.SourceTable (ID, Name) VALUES (1, 'Matt'), (1, 'Rocks'), (2, 'Stylus'), (3, 'Foo'), (3, 'Bar'), (3, 'Baz') 

क्वेरी परिणाम:

 ID FullName ----------- ------------------------------ 2 Stylus 3 Bar, Baz, Foo 1 Matt, Rocks 

क्या तरीके हैं जो वास्तव में धीमा है? इज़जिक बेन-गान लिखते हैं कि इस पद्धति का उनके टी-एसक्यूएल क्वेरीिंग पुस्तक में अच्छा प्रदर्शन है (श्री बेन-गान एक विश्वसनीय स्रोत हैं, मेरे विचार में)।

 create table #t (id int, name varchar(20)) insert into #t values (1, 'Matt'), (1, 'Rocks'), (2, 'Stylus') select id ,Names = stuff((select ', ' + name as [text()] from #t xt where xt.id = t.id for xml path('')), 1, 2, '') from #tt group by id 

हालांकि @ सिर्ज जवाब सही है लेकिन मैंने एक्सएमएलपीथ के खिलाफ अपने तरीके से समय की तुलना की है और मैंने पाया कि xmlpath इतना तेज है। मैं तुलना कोड लिखूंगा और आप स्वयं इसे देख सकते हैं यह @ सर्ज मार्ग है:

 DECLARE @startTime datetime2; DECLARE @endTime datetime2; DECLARE @counter INT; SET @counter = 1; set nocount on; declare @YourTable table (ID int, Name nvarchar(50)) WHILE @counter < 1000 BEGIN insert into @YourTable VALUES (ROUND(@counter/10,0), CONVERT(NVARCHAR(50), @counter) + 'CC') SET @counter = @counter + 1; END SET @startTime = GETDATE() ;WITH Partitioned AS ( SELECT ID, Name, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Name) AS NameNumber, COUNT(*) OVER (PARTITION BY ID) AS NameCount FROM @YourTable ), Concatenated AS ( SELECT ID, CAST(Name AS nvarchar) AS FullName, Name, NameNumber, NameCount FROM Partitioned WHERE NameNumber = 1 UNION ALL SELECT P.ID, CAST(C.FullName + ', ' + P.Name AS nvarchar), P.Name, P.NameNumber, P.NameCount FROM Partitioned AS P INNER JOIN Concatenated AS C ON P.ID = C.ID AND P.NameNumber = C.NameNumber + 1 ) SELECT ID, FullName FROM Concatenated WHERE NameNumber = NameCount SET @endTime = GETDATE(); SELECT DATEDIFF(millisecond,@startTime, @endTime) --Take about 54 milliseconds 

और यह xmlpath है:

 DECLARE @startTime datetime2; DECLARE @endTime datetime2; DECLARE @counter INT; SET @counter = 1; set nocount on; declare @YourTable table (RowID int, HeaderValue int, ChildValue varchar(5)) WHILE @counter < 1000 BEGIN insert into @YourTable VALUES (@counter, ROUND(@counter/10,0), CONVERT(NVARCHAR(50), @counter) + 'CC') SET @counter = @counter + 1; END SET @startTime = GETDATE(); set nocount off SELECT t1.HeaderValue ,STUFF( (SELECT ', ' + t2.ChildValue FROM @YourTable t2 WHERE t1.HeaderValue=t2.HeaderValue ORDER BY t2.ChildValue FOR XML PATH(''), TYPE ).value('.','varchar(max)') ,1,2, '' ) AS ChildValues FROM @YourTable t1 GROUP BY t1.HeaderValue SET @endTime = GETDATE(); SELECT DATEDIFF(millisecond,@startTime, @endTime) --Take about 4 milliseconds 

उन लोगों के लिए जिन्होंने यह पाया और Azure SQL डेटाबेस का उपयोग नहीं कर रहे हैं :

PostgreSQL में STRING_AGG() , SQL सर्वर 2017 और Azure SQL
https://www.postgresql.org/docs/current/static/functions-aggregate.html
https://docs.microsoft.com/en-us/sql/t-sql/functions/string-agg-transact-sql

MySQL में GROUP_CONCAT()
http://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat

(@ ब्रेनजॉर्डेन और @ एमिलानियो अज़ुर अपडेट के लिए धन्यवाद)

अच्छी तरह से मेरा पुराना गैर-उत्तर सही तरीके से हटा दिया गया (नीचे छोड़ा गया), लेकिन अगर किसी को भविष्य में यहां पहुंचा दिया जाए, तो अच्छी खबर है उन्होंने Azure SQL डेटाबेस में भी STRING_AGG () implimented हैं इससे मूल रूप से इस पोस्ट में मूल रूप से अनुरोधित सटीक कार्यक्षमता प्रदान की जानी चाहिए और समर्थन में बनाया गया है। @ हार्वकी ने इस समय इस समय एक एसक्यूएल सर्वर 2016 सुविधा के रूप में उल्लेख किया है।

ओपी के अनुरोध के लिए उपयोग बहुत आसान है:

 select id, STRING_AGG(name, ', ') as names from some_table group by id 

https://msdn.microsoft.com/en-us/library/mt790580.aspx

— पुराना पोस्ट: यहां सीधे @आररोबी का जवाब देने के लिए पर्याप्त प्रतिष्ठा नहीं है, लेकिन STRING_AGG बहुत अच्छा लग रहा है, हालांकि यह केवल SQL Server 2016 vNext में वर्तमान में उपलब्ध है। उम्मीद है कि यह जल्द ही Azure SQL Datababse का अनुसरण करेगा ..