2011-08-29 21 views
5

अपडेट करें I तालिकाओं में डुप्लिकेट पंक्तियां हैं।डुप्लीकेट पंक्तियों को कैसे हटाएं और तालिका

मैं दो टेबल जो एक विदेशी कुंजी

regions (id) 
orders (region_id) 

क्षेत्रों के नाम दोहराया गया है से जुड़े हुए हैं है। मैं इन डुप्लिकेट पंक्तियों को हटाना चाहता हूं और ऑर्डर टेबल अपडेट करना चाहता हूं जो डुप्लिकेट की गई विदेशी कुंजी अब केवल क्षेत्र तालिका में मौजूदा नाम को छोड़ने के लिए सेट की जाएगी।

उदाहरण:

regions table: 

id name 
1 | test 
2 | test 
3 | foo 

orders table: 

id region_id 
6 | 1 
7 | 2 
9 | 3 

मैं चाहता हूँ

orders table: 

id region_id 
6 | 1 
7 | 1 
9 | 3 

regions table: 

id name 
1 | test 
3 | foo 

मैं इस एसक्यूएल के साथ दोहराया पंक्तियों प्राप्त कर सकते हैं:

SELECT name, count(id) as cnt FROM regions 
GROUP BY name HAVING cnt > 1 

मैं कैसे आदेश तालिका के साथ इस चयन कनेक्ट कर सकते हैं और दोहराया हटाना पंक्तियों और तालिका अद्यतन करें?

+0

डुप्लिकेट को सहेजने के लिए किस रिकॉर्ड के लिए तर्क है? मैं पहली बार मानता हूं (यानी सबसे कम प्राथमिक कुंजी)। क्या आपके पास दूसरी तकनीक तक पहुंच है। MySQL के साथ सीधे ऐसा करना मुश्किल है। –

+1

लुकास यह सिर्फ पंक्तियों को हटा नहीं रहा है। मुझे विदेशी चाबियाँ अपडेट करने की ज़रूरत है! – senzacionale

+0

मुझे खेद है, आप सही हैं ... –

उत्तर

5

आदेश मेज, की तरह कुछ अपडेट करने के लिए:

update orders 
join regions r1 
on  r1.id = orders.region_id 
set  orders.region_id = 
     (
     select min(r2.id) 
     from regions r2 
     where r2.name = r1.name 
     ) 

उसके बाद, आप के साथ डुप्लिकेट पंक्तियों को हटा सकते हैं:

delete regions 
from regions 
where id not in 
     (
     select id 
     from (
       select min(id) as id 
       from regions 
       group by 
        name 
       ) as SubqueryAlias 
     ) 

डबल सबक्वेरी MySQL त्रुटि ERROR 1093 (HY000) at line 36: You can't specify target table 'regions' for update in FROM clause से बचने के लिए आवश्यक है।

+0

@senzacionale: अजीब, यह मदद के लिए मेरे MySQL स्थापना – Andomar

+0

thx पर काम करता है। मुझे नहीं पता कि आपको इसके लिए दोहराव की आवश्यकता है। – senzacionale

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