2017-10-16 50 views
6

निकालते हुए एक mysql डेटाबेस में के बाद अनूठा रिकॉर्ड, मैं एक व्यवसाय यूनिट तालिका जो एक ग्राहक के व्यापार इकाइयों का पदानुक्रम को बनाए रखने की है। प्रत्येक व्यावसायिक इकाई में माता-पिता और/या बच्चे हो सकते हैं।mysql - रखते हुए माता-पिता बच्चे का रिश्ता

products_client_1.business_units

id parent_id 
1 
2 1 
3 1 
4 1 
8 1 
14 3 
17 2 
31 1 
35 4 
36 1 
37 4 
38 2 
39 31 
40 8 
41 3 
42 31 
43 
44 43 

वर्तमान में, मैं एक ग्राहक आईडी तालिका जो एक व्यापार इकाई स्तर

contacts_client_1.buid_customer_id

global_id customer_id bu_id 
ABC1000033 1812130  2 
ABC1000033 1812130  54 
ABC1000034 4049809  2 
ABC1000035 5630631  2 
ABC1000082 5707052  2 
ABC1000082 1111116  54 
ABC1000091 5813085  2 
ABC1000091 5813085  54 
ABC1000093 5208477  2 
ABC1000115 5045891  2 
ABC1000115 5045891  54 
ABC1000117 6114245  2 
ABC1000117 6114247  54 
ABC1000117 6114247  1 
ABC1000111 1234567  38 
ABC1000100 9023456  43 
ABC1000100 9023457  44 

आने वाले समय में कम से ग्राहक आईडी का कहना है , मैं custo को बनाए रखना नहीं चाहता व्यक्तिगत व्यापार इकाई स्तर पर मेर आईडी। यह किसी दिए गए वैश्विक आईडी के लिए अद्वितीय होना चाहिए। इसके लिए मैं निम्नलिखित स्थिति के आधार पर मौजूदा ग्राहक आईडी डेटा माइग्रेट करना चाहता हूं।

यदि किसी वैश्विक आईडी में ग्राहक केवल एक ही बीयू के लिए है, तो इसे माइग्रेट करें क्योंकि यह bu_id के बिना है।

यदि वैश्विक आईडी में ग्राहक 2 बीयू के लिए ग्राहक हैं (वे किसी भी स्तर पर माता-पिता हो सकते हैं), ग्राहक को सबसे अधिक उपलब्ध बीयू के ग्राहक रखें।

आवश्यक तालिका contacts_client_1.customer_id

global_id customer_id 
ABC1000033 1812130 
ABC1000034 4049809 
ABC1000035 5630631 
ABC1000082 5707052 
ABC1000091 5813085 
ABC1000093 5208477 
ABC1000100 9023456 
ABC1000111 1234567 
ABC1000115 5045891 
ABC1000117 6114247 

पुनश्च: globalId अलग माता पिता सबसे बीयू के बीच अतिव्यापी नहीं हैं।

business_unit तालिका products_client_1 स्कीमा के अधीन है और buid_customer_id तालिका contacts_client_1 स्कीमा के अधीन है।

एक ही कोड विभिन्न ग्राहकों के लिए निष्पादन योग्य होना चाहिए।

यह एक बार माइग्रेशन है।

क्वेरी लिखित रूप में की आवश्यकता है।

+0

साथ global_id और customer_id कॉपी कर सकते हैं आप 'buid_customer_id' तालिका में पंक्तियों को हटाना चाहते हैं? –

+1

क्या "सबसे अधिक उपलब्ध" निर्धारित करता है? अपने नमूना डेटा में, कृपया चिह्नित करें कि कौन से लोगों को हटाया जाना चाहिए। –

+0

मैं चाहता हूं कि BU_ID कॉलम हटा दिया जाए। अभी तक, प्राथमिक कुंजी Global_id + BU_ID है। ग्राहक_आईडी बीयू स्तर पर है। अब मैं इस बाधा को हटाना चाहता हूं और इसे क्लाइंट स्तर पर स्टोर करना चाहता हूं। मौजूदा डेटा को नई तालिका में माइग्रेट किया जाना चाहिए जिसमें केवल प्राथमिक कुंजी के रूप में Global_id है। –

उत्तर

0

मुझे यकीन है कि वास्तव में क्या आप अपने डेटा के साथ क्या करने जा रहे नहीं कर रहा हूँ, लेकिन निम्नलिखित की मदद करनी चाहिए:

select child.* 
from contacts_client_1.buid_customer_id child 
left join products_client_1.business_units bu 
    on bu.id = child.bu_id 
left join contacts_client_1.buid_customer_id parent 
    on parent.global_id = child.global_id 
    and parent.bu_id  = bu.parent_id 
where parent.global_id is null 
:

केवल पंक्तियों जो buid_customer_id तालिका में एक ही global_id के लिए कोई जनक दिखाएँ

उदाहरण:

  • पंक्ति (ABC1000100 9023456 43) - bu_id (43) buid_customer_id में कोई माता पिता है, तो कोई चटाई नहीं होगा पहले बाएं जॉइन के लिए च और दूसरे के लिए कोई मैच नहीं। चूंकि बाईं ओर से सभी कॉलम टेबल में शामिल हो जाएंगे, parent.global_id is null सत्य है और पंक्ति का चयन किया जाएगा।
  • पंक्ति (ABC1000100 9023457 44) - bu_id (44) एक parent_id (43) है, तो पहले एक मैच मिलेगा शामिल हों।दूसरी जॉइन को एक मैच भी मिलेगा, क्योंकि पेरेंट बीयू और उसी global_id के साथ एक पंक्ति buid_customer_id तालिका में मौजूद है। इस प्रकार parent.global_id पूर्ण नहीं है और पंक्ति का चयन नहीं किया जाएगा।
  • पंक्ति (ABC1000033 1812130 2) - bu_id (2) में parent_id (1) है। पहली जॉइन एक मैच मिलेगा। लेकिन buid_customer_id तालिका में bu_id = 1 और global_id = ABC1000033 के साथ कोई पंक्ति नहीं है, इसलिए दूसरी जॉइन के लिए कोई मिलान नहीं है। इस प्रकार parent.global_id शून्य होगा और पंक्ति का चयन किया जाएगा।

अब आप इस बयान डेटा एक नई तालिका को

insert into new_table 
    select child.* 
    [..] 

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

जो एक ही global_id के लिए एक माता पिता पंक्ति सभी पंक्तियों को नष्ट करें:

delete child 
from contacts_client_1.buid_customer_id child 
join products_client_1.business_units bu 
    on bu.id = child.bu_id 
join contacts_client_1.buid_customer_id parent 
    on parent.global_id = child.global_id 
    and parent.bu_id  = bu.parent_id 

अब तालिका buid_customer_id ही पंक्तियों जो पहली क्वेरी द्वारा चुने जाते हैं शामिल होंगे। यदि यह डेटा किसी अन्य तालिका में होना चाहिए - बस इसका नाम बदलें। तो फिर तुम

insert into customer_id (global_id, customer_id) 
    select global_id, customer_id 
    from new_table 
संबंधित मुद्दे