2012-04-16 11 views
6

यहाँ तालिका के उदाहरण संरचना होती है:एसक्यूएल में एक एकल स्तंभ में पुनरावर्ती parentID दिखाने के लिए कैसे

ID Name  ParentID 
----------------------- 
1  Ancestor  NULL 
2  GrandFather 1 
3  GrandMother 1 
4  Child   3 

मैं एक प्रश्न है कि वापसी होगी लिखने के लिए कोशिश कर रहा हूँ

ID  Name  Family 
---------------------------- 
1  Ancestor 
2  GrandFather Ancestor 
3  GrandMother Ancestor 
4  Child  Ancestor^GrandMother 

मुश्किल भाग यह है कि मैं सभी पंक्तियों के परिवार और शीर्ष-डाउन ऑर्डर में दिखाना चाहता हूं।

किसी को भी सही दिशा में मुझे बात कर सकते हैं, यह सराहना जाएगा :)

संपादित :: यह वास्तविक क्वेरी है, लेकिन यह एक ही विचार इस प्रकार है। यह लाइन पर एक त्रुटि देता है: marketparent.family + '^' + t2.marketGroupName नहीं कर सकते क्योंकि यह marketparent

WITH marketparent (marketGroupID,parentGroupID, marketGroupName,family) 
AS 
(
SELECT marketGroupID, 
     parentGroupID, 
     marketGroupName, 
     '' as family 
FROM EVE.dbo.invMarketGroups 
WHERE parentGroupID IS NULL 
UNION ALL 

    SELECT t2.parentGroupID, 
    t2.marketGroupID, 
    t2.marketGroupName, 
    marketparent.family + '^'+ t2.marketGroupName 
    FROM EVE.dbo.invMarketGroups as t2 
    INNER JOIN marketparent as mp 
    ON mp.marketGroupID = t2.parentGroupID 
) 

-- Statement using the CTE 

SELECT TOP 10 * 
FROM marketparent; 
+3

समाधान डीबीएमएस आप उपयोग पर निर्भर करेगा। एसक्यूएल सर्वर, ओरेकल, MySQL या ....? –

+0

मैं SQL Server 2008 – darthun08

+0

का उपयोग कर रहा हूं 'मार्केटपेरेंट' के बजाय उपनाम 'mp' का उपयोग करें। –

उत्तर

5

आप अपने डीबीएमएस निर्दिष्ट नहीं किया है लगता है, इसलिए मैं PostgreSQL

WITH RECURSIVE fam_tree (id, name, parent, family) as 
(
    SELECT id, 
     name, 
     parentid, 
     ''::text as family 
    FROM the_unknown_table 
    WHERE parent IS NULL 

    UNION ALL 

    SELECT t2.id, 
     t2.name, 
     t2.parentid, 
     fam_tree.family || '^' || t2.name 
    FROM the_unknown_table t2 
    INNER JOIN fam_tree ON fam_tree.id = t2.parentid 
) 
SELECT * 
FROM fam_tree; 

संभालने कर रहा हूँ यह मानक एसक्यूएल है (::text टाइपकास्ट को छोड़कर) जो कि अधिकांश आधुनिक डीबीएमएस पर बहुत कम बदलावों के साथ काम करना चाहिए।

संपादित:

एसक्यूएल सर्वर के लिए आप (माइक्रोसॉफ्ट के गैर standar + के साथ मानक concatention चरित्र को बदलने के लिए की आवश्यकता होगी और आप recursive कीवर्ड जो मानक द्वारा लेकिन कुछ अजीब कारण के लिए आवश्यक है हटाने की जरूरत SQL सर्वर द्वारा अस्वीकार)

WITH fam_tree (id, name, parent, family) as 
(
    SELECT id, 
     name, 
     parentid, 
     '' as family 
    FROM the_unknown_table 
    WHERE parent IS NULL 

    UNION ALL 

    SELECT t2.id, 
     t2.name, 
     t2.parentid, 
     fam_tree.family + '^' + t2.name 
    FROM the_unknown_table t2 
    INNER JOIN fam_tree ON fam_tree.id = t2.parentid 
) 
SELECT * 
FROM fam_tree; 
+0

अब अगर मैं एक पंक्ति के परिवार को उत्पन्न करना चाहता हूं जो किसी अन्य तालिका में है लेकिन इस तालिका में एक विदेशी कुंजी है, तो क्या मैं अंतिम क्वेरी में कुछ कोड जोड़ सकता हूं या क्या मुझे कुछ में रखना होगा? – darthun08

+0

fam_tree.family + '^' + t2.name त्रुटि देता है: बहु-भाग पहचानकर्ता "fam_tree.family" बाध्य नहीं हो सका। शायद मेरे कारण यह मेरे प्रश्न में सही भाषा निर्दिष्ट नहीं कर रहा है। मैं एमएस एसक्यूएल सर्वर 2008 का उपयोग कर रहा हूं, और बाकी के लिए, मुझे नहीं पता कि आपको कौन सी जानकारी चाहिए: पी – darthun08

+0

@ user1336586: हम्म, 'fam_tree.family +'^'+ t2.name' सभी के लिए काम करना चाहिए मुझे पता है। चूंकि मेरे पास आपकी टेबल नहीं है, मैं कुछ टाइपो मानता हूं। भाग के साथ में स्तंभ परिभाषा निकालने का प्रयास करें: के रूप में (... '' –

0

आप एक रिकर्सिव Common Table Expression का उपयोग कर सकते हैं।

declare @T table 
(
    ID int, 
    Name nvarchar(15), 
    ParentID int 
); 

insert into @T values 
(1,  N'Ancestor',  NULL), 
(2,  N'GrandFather', 1), 
(3,  N'GrandMother', 1), 
(4,  N'Child',   3); 

with C as 
(
    select T.ID, 
     T.Name, 
     T.ParentID, 
     cast(N' ' as nvarchar(max)) as Family 
    from @T as T 
    where T.ParentID is null 
    union all 
    select T.ID, 
     T.Name, 
     T.ParentID, 
     C.Family+'^'+C.Name 
    from @T as T 
    inner join C 
     on T.ParentID = C.ID 
) 
select C.ID, 
     C.Name, 
     stuff(C.Family, 1, 2, '') as Family 
from C; 
+0

आपको बहुत धन्यवाद, मैं कोशिश करूँगा कि – darthun08

+0

@user ने यह काम आपके लिए किया है? मैं देखता हूं कि आपके पास स्वीकृत उत्तर के साथ कुछ समस्याएं थीं जो मुझे विश्वास है कि मेरे जवाब में मेरा ख्याल रखा जाता है। –

+0

नहीं, यह काम नहीं किया। मुझे एक और समाधान मिला जहां मैं एक नई टेबल बनाता हूं और मूल्यों को पुनरावृत्त तरीके से अद्यतन करता हूं। यदि आपके पास समय है, तो कृपया मेरी नई पोस्ट की तलाश करें, मुझे अभी भी एक ही चीज़ के साथ मदद की ज़रूरत है। – darthun08

0
select T.ID, T.Name, (select name from table where ID=T.ParentID)as Family 
from table T 
+0

आपकी क्वेरी केवल हर पंक्ति के मूल नाम को वापस करने के लिए प्रतीत होता है। यह एक अच्छा प्रयास है, लेकिन मैं पूरा रास्ता तलाश रहा हूँ :) – darthun08