2012-03-22 26 views
5

मैं एक तालिका में यह डेटा, उदाहरण के लिए,कैसे छोड़ दिया करने के लिए शामिल होने या भीतरी एक मेज ही में शामिल होने

id  name  parent  parent_id 
1  add   self  100 
2  manage  null  100 
3  add   10   200 
4  manage  null  200 
5  add   20   300 
6  manage  null  300 

मैं कैसे left join या inner join इस तालिका में ही तो मैं नीचे इस परिणाम प्राप्त कर सकते हैं?

id  name  parent 
2  manage  self 
4  manage  10 
6  manage  20 

आप मुझे लगता है कि मैं सिर्फ 'प्रबंधन' के कीवर्ड के साथ पंक्ति क्वेरी करना चाहते हैं कर सकते हैं, लेकिन मैं स्तंभ चाहते रूप parent रूप प्रबंधन में के रूप में पंक्ति 'में डेटा जोड़ने' ' परिणाम में पंक्ति।

क्या यह संभव है?

संपादित करें:

मेरे वास्तविक तालिका के सरलीकृत संस्करण - system,

system_id parent_id type function_name  name  main_parent   make_accessible  sort 
31   30   left main    Main  NULL    0     1 
32   31   left page_main_add  Add   self    0     1 
33   31   left page_main_manage Manage  NULL    0     2 

मेरी वास्तविक क्वेरी और यह काफी पहले से ही गंदा है ...

SELECT 
    a.system_id, 
    a.main_parent, 
    b.name, 
    b.make_accessible, 
    b.sort 

FROM system AS a 

INNER JOIN -- self -- 
(
    SELECT system_id, name, make_accessible, sort 
    FROM system AS s2 

    LEFT JOIN -- search -- 
    (
    SELECT system_id AS parent_id 
    FROM system AS s1 
    WHERE s1.function_name = 'page' 
    ) AS s1 

    ON s1.parent_id = s2.parent_id 

    WHERE s2.parent_id = s1.parent_id 
    AND s2.system_id != s1.parent_id 
    ORDER BY s2.sort ASC 
) b 
ON b.system_id = a.parent_id 


WHERE a.function_name LIKE '%manage%' 
ORDER BY b.sort ASC 

परिणाम मैं वर्तमान में,

system_id main_parent  name make_accessible sort 
33   NULL   Main 0    1 

लेकिन मैं इस के बाद कर रहा हूँ,

system_id main_parent  name make_accessible sort 
33   self   Main 0    1 

उत्तर

9

तुम सिर्फ तालिका में दो बार संदर्भित करने के लिए की जरूरत है:

select t1.id, t1.name, t2.id, t2.name 
from TableA t1 
    inner join TableA t2 
    on t1.parent_id = t2.Id 

बाईं में शामिल होने के लिए यदि आप सूची में जड़ों देखना चाहता हूँ के साथ आंतरिक बदलें।

अद्यतन:

मैं अपने प्रश्न पढ़ने में भूलना। ऐसा लगता है कि आपके पास हमेशा दो पंक्तियां होती हैं, एक का प्रबंधन करें और एक जोड़ें। प्रबंधन से "जोड़ें" तक कैसे पहुंचेंगे:

select system.*, (select parent 
        from system s2 
        where s2.parent_id = system.parent_id 
        and s2.name = 'add') 
       AS parent 
from system 
where name = 'manage' 

या, आप दो व्युत्पन्न तालिकाओं में तालिका विभाजित है और उन्हें PARENT_ID द्वारा शामिल हो सकता है:

select * 
    from system 
    inner join 
    (
    select * from system where name = 'add' 
) s2 
    on system.parent_id = s2.parent_id 
    where system.name = 'manage' 

यह आपको से सभी स्तंभों का उपयोग करने की अनुमति देगा s2।

+0

संपादन और उत्तर के लिए धन्यवाद। इसका परीक्षण किया और इसे सही मिला। धन्यवाद! – laukok

2

UPDATED: PARENT_ID द्वारा में शामिल होने से, कोशिश:

select m.id, m.name, a.parent 
from myTable m 
join myTable a on m.parent_id = a.parent_id and a.name = 'add' 
where m.name = 'manage' 

बदलें भीतरी एक बाईं ओर में शामिल होने में शामिल होने अगर वहाँ एक इसी पंक्ति को जोड़ा नहीं हो सकता है।

+1

मुझे नहीं लगता कि आपको आईडी मानों पर हमेशा निर्भर रहना चाहिए। यह मेरे लिए एक बहुत ही खतरनाक धारणा की तरह लगता है, लेकिन शायद विशेष प्रणाली इसे अनुमति देता है। – MJB

+0

@ एमजेबी: मैंने इसे ** ** ** पंक्तियों में ** ** को प्रबंधित करने के लिए अपडेट किया है ** इसके बजाय parent_id पर पंक्तियां प्रबंधित करें। –

+0

धन्यवाद संपादन और उत्तर के लिए चिह्नित करें। – laukok

2

आपका डेटा किसी बच्चे-अभिभावक श्रेणीबद्ध संरचना का पालन नहीं करता है। उदाहरण के लिए, आपका कॉलम parent मान 10 रखता है, जो किसी भी id का मान नहीं है, इसलिए एक बाल-अभिभावक संघ संभव नहीं है।

दूसरे शब्दों में, वहाँ कुछ भी नहीं है कि, रिकॉर्ड 1,add,self, या 4,manage,null3,add,10 को रिकॉर्ड करने के लिए रिकॉर्ड 2,manage,null संबंधित है के रूप में आप अपने प्रश्न में क्या करने का इरादा है।

पदानुक्रमित डेटा का प्रतिनिधित्व करने के लिए, आपको आमतौर पर एक सारणी की आवश्यकता होती है जिसमें एक विदेशी कुंजी है जो इसकी अपनी प्राथमिक कुंजी का संदर्भ देती है। तो आपका कॉलम parent कॉलम id का संदर्भ लेना चाहिए, फिर आप manage और add के बीच एक बाल-अभिभावक संबंध व्यक्त कर सकते हैं। वर्तमान में, यह संभव नहीं है।

+0

क्षमा करें, शायद मुझे अधिक जानकारी और वास्तविक तालिका प्रदान करनी चाहिए जो मैं काम कर रहा हूं। कृपया उपरोक्त मेरे संपादन पर एक नज़र डालें। धन्यवाद। – laukok

संबंधित मुद्दे