স্ক্লাইট ডাটাবেস থেকে সদৃশ সারি মুছে ফেলা হচ্ছে


92

SQLite3 এ আমার 36 মিলিয়ন সারি - একটি বিশাল টেবিল রয়েছে। এই খুব বড় টেবিলটিতে দুটি কলাম রয়েছে:

  • hash - পাঠ্য
  • d - বাস্তব

সারিগুলির কয়েকটি হ'ল সদৃশ। যে উভয় hashএবং dএকই মান আছে। দুটি হ্যাশ যদি অভিন্ন হয় তবে এর মানগুলিও তাই d। যাইহোক, দুটি অভিন্ন একই dসাথে দুটি অভিন্ন হিসাবে বোঝায় না hash

আমি সদৃশ সারিগুলি মুছতে চাই। আমার কাছে প্রাথমিক কী কলাম নেই।

এটি করার দ্রুততম কোনটি?


উত্তর ব্লকে উত্তর দিন place পরে, আপনি নিজের উত্তরটি গ্রহণ করতে পারেন। এছাড়াও দেখুন একটি উত্তর গ্রহণ কীভাবে কাজ করে?
jwww

উত্তর:


122

সারিগুলি আলাদা করার জন্য আপনার একটি উপায় দরকার। আপনার মন্তব্যের ভিত্তিতে আপনি তার জন্য বিশেষ রোউইড কলামটি ব্যবহার করতে পারেন ।

rowidপ্রতি সর্বনিম্ন রেখে সদৃশগুলি মুছতে (hash,d):

delete   from YourTable
where    rowid not in
         (
         select  min(rowid)
         from    YourTable
         group by
                 hash
         ,       d
         )

এসকিউএলাইট আপনাকে একটি প্রাথমিক কী কলামটি যুক্ত করতে দেয় না, তাই না?
প্যাচগুলি

sqlite> alter table dist add id integer primary key autoincrement; Error: Cannot add a PRIMARY KEY column
প্যাচগুলি

মজাদার! আপনার যে অংশটি প্রয়োজন তা হল autoincrement, আপনি যদি primary keyঅংশটি বাদ দেন তবে এটি কাজ করে ?
Andomar

sqlite> alter table dist add id integer autoincrement; Error: near "autoincrement": syntax error সম্পাদনা: এসকিউএলাইটে একটি "রোউইড" সিউডো কলাম টাইপ জিনিস রয়েছে যা স্বয়ংক্রিয়ভাবে সেখানে আছে, আমি কি এটি ব্যবহার করতে পারি?
প্যাচগুলি

4
delete from dist where rowid not in (select max(rowid) from dist group by hash); কৌতুক করতে দেখা যাচ্ছে! ধন্যবাদ
প্যাচগুলি

5

আমার ধারণা, দ্রুততম এটির জন্য খুব ডাটাবেস ব্যবহার করা হবে: একই কলামগুলির সাথে একটি নতুন টেবিল যুক্ত করুন, তবে যথাযথ সীমাবদ্ধতার সাথে (হ্যাশ / রিয়েল পেয়ারের একটি অনন্য সূচক?), মূল টেবিলটি দিয়ে পুনরাবৃত্তি করুন এবং রেকর্ডগুলি সন্নিবেশ করানোর চেষ্টা করুন নতুন সারণি, সীমাবদ্ধতা লঙ্ঘনের ত্রুটি উপেক্ষা করে (যেমন ব্যতিক্রমগুলি উত্থাপিত হলে পুনরাবৃত্তি চালিয়ে যান)।

তারপরে পুরানো টেবিলটি মুছুন এবং পুরানোটির নতুন নামকরণ করুন।


কেবল টেবিল পরিবর্তন করার মতো মার্জিত নয়, আমার ধারণা, তবে আপনার পদ্ধতির সম্পর্কে একটি ভাল জিনিস হ'ল আপনি ফলাফলের সাথে একেবারেই খুশি না হওয়া অবধি উত্সের ডেটা স্পর্শ / ধ্বংস না করে আপনি যতবার চান তা চালিয়ে যেতে পারবেন you ।
অ্যাড্রিয়ান কে

1

যদি প্রাথমিক কী যুক্ত করা কোনও বিকল্প না হয়, তবে একটি পদ্ধতির অনুরূপ হ'ল নকলগুলি DISTINCT একটি টেম্প টেবিলের মধ্যে সংরক্ষণ করা, বিদ্যমান সারণী থেকে সমস্ত নকল রেকর্ড মুছুন এবং তারপরে টেম্প টেবিল থেকে মূল টেবিলে রেকর্ডগুলি যুক্ত করুন to ।

উদাহরণস্বরূপ (এসকিউএল সার্ভার ২০০৮-এর জন্য লেখা, তবে কৌশলটি কোনও ডাটাবেসের ক্ষেত্রে এক রকম):

DECLARE @original AS TABLE([hash] varchar(20), [d] float)
INSERT INTO @original VALUES('A', 1)
INSERT INTO @original VALUES('A', 2)
INSERT INTO @original VALUES('A', 1)
INSERT INTO @original VALUES('B', 1)
INSERT INTO @original VALUES('C', 1)
INSERT INTO @original VALUES('C', 1)

DECLARE @temp AS TABLE([hash] varchar(20), [d] float)
INSERT INTO @temp
SELECT [hash], [d] FROM @original 
GROUP BY [hash], [d]
HAVING COUNT(*) > 1

DELETE O
FROM @original O
JOIN @temp T ON T.[hash] = O.[hash] AND T.[d] = O.[d]

INSERT INTO @original
SELECT [hash], [d] FROM @temp

SELECT * FROM @original

আমি নিশ্চিত না যে স্ক্লাইটে কোনও ROW_NUMBER()ধরণের ফাংশন রয়েছে কিনা, তবে এটি যদি আপনি এখানে তালিকাভুক্ত কিছু পদ্ধতির চেষ্টাও করতে পারেন: প্রাথমিক কী ছাড়াই এসকিউএল টেবিল থেকে নকল রেকর্ড মুছুন


+1, স্ক্লাইট delete <alias> from <table> <alias>যদিও সিনট্যাক্স সমর্থন করে কিনা তা নিশ্চিত নয়
Andomar
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.