sql - मैं तालिका में डुप्लिकेट पंक्तियों को कैसे हटा सकता हूं




sql-server database (9)

मेरे पास एक मेज है जिसमें 3 कॉलम हैं I कोई प्राथमिक कुंजी नहीं है, इसलिए डुप्लिकेट पंक्तियां हो सकती हैं। मुझे सिर्फ एक रखना और दूसरों को हटाने की आवश्यकता है यह कैसे करना है कोई भी विचार एसक्यूएल सर्वर है?

https://code.i-harness.com


एक किराए की प्राथमिक कुंजी के रूप में कार्य करने के लिए एक पहचान कॉलम जोड़ें, और इसका उपयोग करने के लिए दो पंक्तियों में से दो को हटाए जाने के लिए उपयोग करें।

मैं बाद में जगह में पहचान कॉलम छोड़ने पर विचार करूंगा, या यदि यह किसी प्रकार की लिंक तालिका है, तो अन्य कॉलमों पर एक कंपाउंड प्राथमिक कुंजी बनाएं।


क्या आप तालिका में प्राथमिक कुंजी पहचान फ़ील्ड जोड़ सकते हैं?


मुझे यकीन नहीं है कि यह DELETE बयान के साथ काम करता है, लेकिन यह डुप्लिकेट पंक्तियों को खोजने का एक तरीका है:

 SELECT *
 FROM myTable t1, myTable t2
 WHERE t1.field = t2.field AND t1.id > t2.id

मुझे यकीन नहीं है कि आप "SELECT" को "DELETE" में बदल सकते हैं (कोई मुझे जानना चाहता है?) , लेकिन अगर आप नहीं कर सकते हैं, तो आप उसे एक सबक्यूबरी में बना सकते हैं


मैं पंक्तियों को अलग से चुनें और उन्हें एक अस्थायी तालिका में फेंक दिया, फिर स्रोत तालिका को छोड़ दें और अस्थायी डेटा को वापस कॉपी करें। संपादित करें: अब कोड स्निपेट के साथ!

INSERT INTO TABLE_2 
SELECT DISTINCT * FROM TABLE_1
GO
DELETE FROM TABLE_1
GO
INSERT INTO TABLE_1
SELECT * FROM TABLE_2
GO

यह आपके लिए एक कठिन स्थिति है। अपनी विशेष स्थिति (तालिका आकार आदि) को जानने के बिना मुझे लगता है कि आपका सबसे अच्छा शॉट एक पहचान कॉलम जोड़ना है, इसे आबाद करना है और उसके बाद उसे हटा देना है आप बाद में कॉलम निकाल सकते हैं लेकिन मैं सुझाव दे सकता हूं कि आपको इसे रखना चाहिए क्योंकि तालिका में होना वास्तव में अच्छी बात है


वर्तमान गड़बड़ी को साफ करने के बाद आप एक प्राथमिक कुंजी जोड़ सकते हैं जिसमें तालिका में सभी फ़ील्ड शामिल होते हैं। जो आपको फिर से गड़बड़ में आने से बचाएगा। बेशक यह समाधान मौजूदा कोड को बहुत अच्छी तरह से तोड़ सकता है। उसे भी संभालना होगा


इस समाधान के बारे में क्या है:

पहले आप निम्न क्वेरी निष्पादित करें:

  select 'set rowcount ' + convert(varchar,COUNT(*)-1) + ' delete from MyTable where field=''' + field +'''' + ' set rowcount 0'  from mytable group by field having COUNT(*)>1

और फिर आपको केवल रिटर्न परिणाम सेट निष्पादित करना होगा

set rowcount 3 delete from Mytable where field='foo' set rowcount 0
....
....
set rowcount 5 delete from Mytable where field='bar' set rowcount 0

जब आप केवल एक कॉलम मिलते हैं, तो मैंने इस मामले को संभाला है, लेकिन एक कॉलम से अधिक एक ही दृष्टिकोण को अनुकूलित करना बहुत आसान है I मुझे बताएं अगर आप मुझे कोड पोस्ट करना चाहते हैं


निम्न उदाहरण भी काम करता है जब आपका पीके सभी तालिका स्तंभों का सिर्फ सबसेट होता है।

(ध्यान दें: मुझे एक और सरोगेट आईडी कॉलम को और अधिक सम्मिलित करने का दृष्टिकोण पसंद है। लेकिन हो सकता है कि यह समाधान भी आसान हो।)

पहले डुप्लिकेट पंक्तियों को ढूंढें:

SELECT col1, col2, count(*)
FROM t1
GROUP BY col1, col2
HAVING count(*) > 1

यदि केवल कुछ ही हैं, तो आप मैन्युअल रूप से उन्हें हटा सकते हैं:

set rowcount 1
delete from t1
where col1=1 and col2=1

"पंक्ति संख्या" का मान डुप्लिकेट की संख्या n-1 बार होना चाहिए। इस उदाहरण में 2 ड्यूलपेट्स हैं, इसलिए पंक्ति संख्या 1 है। यदि आपको कई डुप्लिकेट पंक्तियां मिलती हैं, तो आपको यह प्रत्येक अनन्य प्राथमिक कुंजी के लिए करना होगा।

यदि आपके पास कई डुप्लिकेट हैं, तो प्रत्येक कुंजी एक बार एकतर तालिका में कॉपी करें:

SELECT col1, col2, col3=count(*)
INTO holdkey
FROM t1
GROUP BY col1, col2
HAVING count(*) > 1

फिर चाबियाँ कॉपी करें, लेकिन डुप्लिकेट को समाप्त करें

SELECT DISTINCT t1.*
INTO holddups
FROM t1, holdkey
WHERE t1.col1 = holdkey.col1
AND t1.col2 = holdkey.col2

अपनी चाबियों में आपके पास अब अद्वितीय कुंजियां हैं जांचें कि क्या आपको कोई परिणाम नहीं मिलता है:

SELECT col1, col2, count(*)
FROM holddups
GROUP BY col1, col2

मूल तालिका से डुप्लिकेट हटाएं:

DELETE t1
FROM t1, holdkey
WHERE t1.col1 = holdkey.col1
AND t1.col2 = holdkey.col2

मूल पंक्तियों को सम्मिलित करें:

INSERT t1 SELECT * FROM holddups

बीटीडब्ल्यू और पूर्णता के लिए: ओरेकल में एक छिपी हुई फ़ील्ड है जो आप उपयोग कर सकते हैं (पंक्तिबद्ध):

DELETE FROM our_table
WHERE rowid not in
(SELECT MIN(rowid)
FROM our_table
GROUP BY column1, column2, column3... ;

देखें: माइक्रोसॉफ्ट ज्ञान साइट






database