2011-03-16 11 views
7

मैं एसक्यूएल सर्वर 2005विलोपन केवल

उपयोग कर रहा हूँ मैं इस तरह एक मेज है -

ID Name 
1  a 
1  a 
1  a 
2  b 
2  b 
3  c 
4  d 
4  d 

इस में, मैं सभी डुप्लिकेट प्रविष्टियों हटा सकते हैं और केवल एक ही बनाए रखना चाहते उदाहरण के रूप में -

ID  Name 
1  a 
2  b 
3  c 
4  d 

मैं इस तालिका के लिए एक और पहचान स्तंभ जोड़ने और उस में अद्वितीय संख्या होने और फिर को हटाने डुप्लिकेट रिकॉर्ड द्वारा आसानी से कर सकते हैं। हालांकि मैं जानना चाहता हूं कि क्या मैं इस तालिका में अतिरिक्त कॉलम जोड़ने के बिना डुप्लिकेट रिकॉर्ड हटा सकता हूं।

इसके अतिरिक्त यदि यह केवल एक प्रश्न कथन का उपयोग करके किया जा सकता है। i.e. संग्रहीत प्रक्रियाओं या अस्थायी तालिकाओं का उपयोग किए बिना।

+0

तुम क्यों अनुमोदन किया था [इस अवैध सुझाव संपादित करें] (http://stackoverflow.com/review/suggested-edits/1176084) ? कृपया उचित समीक्षा करने के लिए कुछ समय दें। – hims056

+0

@ hims056 - अब इसे उचित तरीके से संपादित किया गया है। धन्यवाद। –

उत्तर

9

एक CTE में एक ROW_NUMBER का उपयोग करके आप अद्वितीय पंक्तियों को बनाए रखते हुए डुप्लिकेट मानों हटाने देती है।

WITH q AS (
    SELECT RN = ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) 
     , ID 
     , Name 
    FROM ATable 
) 
DELETE FROM q WHERE RN > 1 
-1
delete from table1 
USING table1, table1 as vtable 
WHERE (NOT table1.ID=vtable.ID) 
AND (table1.Name=vtable.Name) 
+0

क्या आप निश्चित रूप से SQL सर्वर में उपयोग कर रहे हैं? मुझे उपयोग के करीब वाक्यविन्यास त्रुटि मिल रही है। –

+0

क्षमा करें, मैंने इसे MySQL के लिए परीक्षण किया है, मैंने सोचा कि यह एसक्यूएल पर भी काम करता है। आपको क्या त्रुटि मिल रही है? – Ervin

+0

कोई समस्या नहीं, मुझे उपयोग के करीब गलत वाक्यविन्यास मिलता है। मुझे नहीं लगता कि एसक्यूएल में कोई उपयोग की जा रही है। इसे फिर से बदल दिया जाएगा। –

-1
DELETE FROM tbl 
WHERE ID NOT IN (
    SELECT MIN(ID) 
    FROM tbl 
    GROUP BY Name 
) 
+0

बस उल्लेख करने के लिए, मैंने आपको कम नहीं किया। लेकिन आईडी डुप्लिकेट पंक्तियों के लिए भी समान हैं। हालांकि, –

+1

यह आईडी के साथ सभी रिकॉर्ड हटा देगा <> 1, ओपी की आवश्यकता नहीं है। (मेरा डाउनवोट बीटीडब्ल्यू नहीं)। –

1

Lieven सही है ... लेकिन आप सिर्फ इस तरह नष्ट बयान में एक शीर्ष खंड जोड़कर Lieven के कोड में और सुधार कर सकते हैं:

(1) क्ष से शीर्ष हटाना जहां आर.एन.> 1;

आशा इस

0

में मदद करता है आप इस क्वेरी का उपयोग कर सकते हैं:

delete a from 
(select id,name, ROW_NUMBER() over (partition by id,name order by id) row_Count 
from dup_table) a 
where a.row_Count >1 
संबंधित मुद्दे