PDA

View Full Version : حرفه ای: delete رکوردهای مساوی



micro24
سه شنبه 31 فروردین 1389, 16:22 عصر
با سلام
من می خوام رکوردهایی که برابرند را delete کنم می دانم از دستور SET ROWCOUNT می توان انجام داد اما در table مربوطه مثلا 2 رکورد دارم که شبیه همند دوباره 2 رکورد دیگر دوباره 3 رکورد مشابه و به همین ترتیب رکوردهای مختلف که چند تا چند تا شبیه همند.حال چه طوری می توانم این ها رو حذف کنم به طوری که از هر کدام از این رکوردهای مشابه تنها یک رکورد حذف شود ؟
لطفا راهنمایی فرمایید

محمد سلیم آبادی
سه شنبه 31 فروردین 1389, 16:31 عصر
سلام،

حال چه طوری می توانم این ها رو حذف کنم به طوری که از هر کدام از این رکوردهای مشابه تنها یک رکورد حذف شود ؟

به جای "حذف شود" نباید می نوشتید "باقی بماند" ؟

bhz8181
چهارشنبه 01 اردیبهشت 1389, 19:38 عصر
يك راه اينه كه شما يك جدول موقتي درست كنيد و اطلاعات رو از جدول اصلي به جدول موقتي منتقل كرده و سپس كل ركوردهاي جدول اصلي رو delete و بعد با select distinct اطلاعات رو از جدول فرعي به جدول اصلي منتقل كنيد و سپس جدول فرعي رو drop كنيد.

micro24
پنج شنبه 02 اردیبهشت 1389, 09:35 صبح
مرسی از راهنمایی ولی میشه با یه مثال نشون بدهید چون من این دستورات را که اجرا میکنم جواب نمیده

supporter
پنج شنبه 02 اردیبهشت 1389, 10:53 صبح
Select * Into #tblTemp From TableName Where 1 = 2
Go
Insert Into #tblTemp Select Distinct * From TableName
Go
Delete From TableName
Go
Insert Into TableName Select * From #tblTemp
Go
Drop table #tblTemp
Go
Select * From TableName
Go

محمد سلیم آبادی
پنج شنبه 02 اردیبهشت 1389, 12:49 عصر
Select * Into #tblTemp From TableName Where 1 = 2
Go
Insert Into #tblTemp Select Distinct * From TableName
Go
Delete From TableName
Go
Insert Into TableName Select * From #tblTemp
Go
Drop table #tblTemp
Go
Select * From TableName
Go


روش های بهتر و ساده تر هم وجود داره که میشه بهشون رجوع کرد. بطور مثال:


;WITH CTE AS (SELECT *,rank = ROW_NUMBER() OVER(PARTITIO BY column1, column2,... ORDER BY (SELECT 1)) FROM table_name)
DELETE FROM CTE WHERE Rank > 1;

supporter
پنج شنبه 02 اردیبهشت 1389, 14:27 عصر
روش های بهتر و ساده تر هم وجود داره که میشه بهشون رجوع کرد. بطور مثال:


;WITH CTE AS (SELECT *,rank = ROW_NUMBER() OVER(PARTITIO BY column1, column2,... ORDER BY (SELECT 1)) FROM table_name)
DELETE FROM CTE WHERE Rank > 1;

بله حق با شماست. البته من كد مربوط به راه حل پست قبلي دوستان رو نوشم.
در ضمن راه حل ارايه شده در SQLSERVER 2000 هم جواب مي‌ده.گر چه توي 2000 هم راه حل هاي ساده تري هم هست.
مرسي از توجهتون

محمد سلیم آبادی
پنج شنبه 02 اردیبهشت 1389, 14:48 عصر
با سلام
من می خوام رکوردهایی که برابرند را delete کنم می دانم از دستور SET ROWCOUNT می توان انجام داد اما در table مربوطه مثلا 2 رکورد دارم که شبیه همند دوباره 2 رکورد دیگر دوباره 3 رکورد مشابه و به همین ترتیب رکوردهای مختلف که چند تا چند تا شبیه همند.حال چه طوری می توانم این ها رو حذف کنم به طوری که از هر کدام از این رکوردهای مشابه تنها یک رکورد حذف شود ؟
لطفا راهنمایی فرمایید

از کدی که در پست شماره ی 6 ارسال کردم استفاده کنید. و چون تنها نیاز به حذف یک نمونه از داده های تکراری دارین می تونین در شرط حذف به جای بزرگتر از یک، مساوی با 2 را بنویسد. یعنی:
WHERE Rank = 2