2010-09-17 15 views
6

मैं Sybase ASE डेटाबेस का उपयोग कर रहा हूं।"शामिल होने पर concatenate" के लिए SQL क्वेरी

टेबल Shops:

--------------------- 
| ShopName | ShopID | 
--------------------- 
| Sweetie | 1  | 
| Candie | 2  | 
| Sugarie | 3  | 
--------------------- 

टेबल Sweets:
मैं दो तालिकाओं कि तरह लग रहे है

---------------------- 
| SweetName | ShopID | 
---------------------- 
| lolly  | 1  | 
| redlolly | 1  | 
| greenloly | 1  | 
| taffy  | 2  | 
| redtaffy | 2  | 
| bluetaffy | 2  | 
| choco  | 3  | 
| mintchoco | 3  | 
| milkchoco | 3  | 
| gummybees | 3  | 
---------------------- 

मैं एक प्रश्न है कि एक परिणाम है कि तरह लग रहा है उत्पन्न होगा लिखना चाहते हैं:

----------------------------------------------------- 
| ShopName | Sweets         | 
----------------------------------------------------- 
| Sweetie | lolly, redlolly, greenlolly   | 
| Candie | taffy, redtaffy, bluetaffy    | 
| Sugarie | choco, mintchoco, milkchoco, gummybees | 
----------------------------------------------------- 

मुझे ऐसा करने के लिए कैसे जाना चाहिए? मुझे इसे एक साइबेस एएसई डेटाबेस के लिए चाहिए। मैंने LIST() फ़ंक्शन का प्रयास किया, लेकिन मुझे उस पर एक त्रुटि मिल रही है। मैंने अपने दस्तावेज की जांच की, और पता चला, यह फ़ंक्शन एएसई संस्करण में उपलब्ध नहीं है।

इसका शायद मतलब है कि कुछ "गतिशील एसक्यूएल" शामिल होंगे (मुझे इसका बहुत कम विचार है)। क्या कोई मदद कर सकता है?

मैं परिणाम तालिका में ShopName के बजाय ShopId चाहता हूं ... मुझे अभी तक निश्चित रूप से पता नहीं है। मुझे लगता है कि इससे कोई फर्क नहीं पड़ता। साथ ही, Sweets परिणामों के कॉलम में पिछली कॉमा कोई समस्या नहीं है। मैं चाहता हूं कि एक गैर-व्हाइटस्पेस विभाजक है।

+0

हम्म लगता है जैसे आप स्ट्रिंग एकत्रीकरण फ़ंक्शन चाहते हैं। मुझे यकीन नहीं है कि कौन से डेटाबेस जो मूल रूप से करते हैं, लेकिन मुझे लगता है कि कुछ समय के लिए उपयोगकर्ता द्वारा परिभाषित कार्यों को देखते हैं (नाट्यर्ली जो एक डीएमबी से दूसरे में भिन्न होता है)। आप किस डेटाबेस का उपयोग कर रहे हैं? – FrustratedWithFormsDesigner

+1

मैं syabse का उपयोग कर रहा हूँ। – jrharshath

+0

'सूची() 'क्या त्रुटियां मिलीं? ऐसा नहीं है कि मैं साइबेस समस्याओं के साथ मदद कर सकता हूं, लेकिन कोई और जो त्रुटि संदेश को पहचान सकता है। – FrustratedWithFormsDesigner

उत्तर

5

आपको यह निर्दिष्ट करना होगा कि आप किस डीबीएमएस का उपयोग कर रहे हैं।

MySQL का GROUP CONCAT बिल्कुल वही है जो आपको चाहिए।

SELECT ShopName, GROUP_CONCAT(SweetName SEPARATOR ", ") 
FROM Shops a 
JOIN Sweets b 
ON a.ShopID = b.ShopID 
GROUP BY ShopName 
+2

और ओरेकल में 'wmsys.wm_concat' है, हालांकि ऐसा लगता है कि यह अनियंत्रित है। मैंने इसे कभी भी इस्तेमाल नहीं किया है, लेकिन इसे बहुत जल्दी पाया। 'कनेक्ट बाय' का उपयोग करके एक और ओरेकल समाधान: http://halisway.blogspot.com/2006/08/oracle-groupconcat-updated-again.html – FrustratedWithFormsDesigner

+0

मुझे इसे sybase एएसई के साथ करने की ज़रूरत है, इसलिए यह मेरे लिए काम नहीं करेगा। .. Sybase में एक LIST() फ़ंक्शन है जो यह करता है, लेकिन यह एएसई संस्करण में मौजूद नहीं है। – jrharshath

+0

मेरा google-fu इस लिंक को प्रकट करता है (http://www.projectdmx.com/tsql/rowconcatenate.aspx)। क्या आप इसे एसक्यूएल में परिवर्तित कर सकते हैं मुझे अपने मामले में आवश्यकता होगी? – jrharshath

1

मैंने SQL सर्वर पर इसका परीक्षण किया, लेकिन उम्मीद है कि यह Sybase पर भी काम करेगा। यदि नहीं, तो शायद यह आपको हल करने के लिए पर्याप्त पास आएगा।

अगर मैं इस समारोह बनाने के लिए:

CREATE FUNCTION SweetsList(@shopID int) 
RETURNS varchar(500) 
AS 
BEGIN 

    DECLARE @list varchar(500) 

    SELECT @list = COALESCE(@list+', ','') + SweetName 
    FROM Sweets 
    WHERE ShopID = @shopID 

    RETURN @list 
END 

मैं तो इस क्वेरी निष्पादित और इच्छित परिणाम प्राप्त कर सकते हैं:

SELECT ShopName, dbo.SweetsList(ShopID) AS Sweets 
FROM Shops 

आशा इस मदद करता है।

+0

मुझे यहां एक ही समस्या है। मेरे लिए (साइबेस एएसई 15.0) जो काम नहीं करता है। किसी कारण से यह केवल अंतिम पंक्ति देता है। क्या यह एक संस्करण निर्भर चीज है? या एक सेटिंग? – Marnix

2

यह एक क्रॉसस्टैब क्वेरी है और एक प्रश्न में साइबेस एएसई के साथ असंभव है।

आप अस्थायी तालिका के साथ एक संग्रहीत प्रक्रिया बना सकते हैं, इसे कर्सर से भर सकते हैं, और इस अस्थायी तालिका से चयन कर सकते हैं।

1

दुर्भाग्यवश, adrift's उत्तर में एक विधि Sybase एएसई के लिए चयन कथन के साथ काम नहीं करती है, परिवर्तनीय @list प्रत्येक पंक्ति के लिए अद्यतन नहीं है, यह केवल अंतिम पंक्ति के लिए काम करता है। लेकिन क्योंकि प्रत्येक पंक्ति और तालिका के आकार के लिए अद्यतन प्रदर्शन बड़ा नहीं होता है, तो आप इसे अद्यतन कथन के साथ कर सकते हैं। छोटा उदाहरण:

declare @list varchar(500) 

    update Sweets 
    set @list = @list + SweetName + ', ' 
    where ShopID = 1 

    select SUBSTRING(@list, 1, Len(@list) - 2) 

पीएस मेरे लिए, कर्सर अच्छा तरीका नहीं है ...

Sybase एएसई में
0

वर्क्स ...

CREATE FUNCTION SweetsList(@SN varchar(10)) 
returns varchar(255) 
AS 
DECLARE @SwNList varchar(255) 
DECLARE @FetchSwN varchar(55) 
DECLARE @Status INT, @Error INT 

DECLARE ListCurs CURSOR FOR 
SELECT SweetName 
    FROM Sweets AS SW 
JOIN Shops AS SH 
    ON SH.ShopID = SW.ShopID 
WHERE SH.ShopName = @SN 
FOR READ ONLY 

OPEN ListCurs 
SELECT @Status = 0 
WHILE @Status = 0 
BEGIN 
    FETCH ListCurs INTO @FetchSwN 

    SELECT @Status = @@SQLSTATUS 

    IF @Status = 0 
    BEGIN 
     SELECT @SwNList = CASE WHEN @SwNList IS NULL THEN '' ELSE @SwNList + ', ' END + @FetchSwN 
    END 
END 
CLOSE ListCurs 
RETURN (@SwNList) 
go 

तो अमल ...

SELECT ShopName, dbo.SweetsList(ShopName) AS Sweets FROM Shops 
संबंधित मुद्दे