PDA

View Full Version : سوال: پاك كردن يكي از دو ركورد شبيه به هم



hossein_sh2008
چهارشنبه 14 فروردین 1392, 19:01 عصر
با سلام دوستان ما يه جدول در بانك sql داريم كه دوتا ركورد مثل هم با تمام فيلدهاي مشابه،آيا امكانش هست كه يك كوئري بنويسيم كه فقط يكي از اون دوتا ركورد پاك بشه و يكي ديگه بمونه البته يه روش ساده هست كه دوتاشو حذف كني و يكي شبيه اون دوباره اضافه كني(شايد احمقانه) كسي از دوستان مي تونه راهنمايي كنه با تشكر

alexmcse
چهارشنبه 14 فروردین 1392, 19:12 عصر
سلام
برای ذخیره کردن رکورد در دیتابیس یک فیلد به صورت پریمیری کی در نظر گرفته میشود چطور در دیتابیس شما دو تا رکورد مشابه که فیلد پریمری کی اون دو عدد مشابه را نمی پذیرد واگر سعی کنی این کار رو انجام بدی پیغام خطا میدهد شما پطور ذخیره کردی ؟
به وسیله شماره پریمیری کی می توانی آن را حذف کنی

tooraj_azizi_1035
چهارشنبه 14 فروردین 1392, 19:16 عصر
مراحل رو دقیق دنبال کن:http://support.microsoft.com/kb/139444

hossein_sh2008
چهارشنبه 14 فروردین 1392, 20:38 عصر
سلام
برای ذخیره کردن رکورد در دیتابیس یک فیلد به صورت پریمیری کی در نظر گرفته میشود چطور در دیتابیس شما دو تا رکورد مشابه که فیلد پریمری کی اون دو عدد مشابه را نمی پذیرد واگر سعی کنی این کار رو انجام بدی پیغام خطا میدهد شما پطور ذخیره کردی ؟
به وسیله شماره پریمیری کی می توانی آن را حذف کنی

سلام دوست عزيز اين يك جدوله كه ريز كاركرد ثبت ميشه و ما خبري از شماره ركورد اون دوتا سطر نداريم

salargham
چهارشنبه 14 فروردین 1392, 21:43 عصر
شما میتونید با استفاه از متد ;()Distinc در دستورات sql این کار رو انجام بدید.این دستور دو سطر شما را یکی در نظر میگیره و با اجرای دستور Delete تنها یک سطر حذف خواهد شد.

hossein_sh2008
جمعه 16 فروردین 1392, 22:11 عصر
شما میتونید با استفاه از متد ;()Distinc در دستورات sql این کار رو انجام بدید.این دستور دو سطر شما را یکی در نظر میگیره و با اجرای دستور Delete تنها یک سطر حذف خواهد شد.


دوست عزیز یک مثال برای دستور Distinc در کوئری delete دارید که همین کار رو انجام بده

veniz2008
جمعه 16 فروردین 1392, 23:38 عصر
سلام.
یک راه میتونه این باشه :
1. ساخت یک جدول موقت که ستون هاش متناظر با جدولتون باید باشه
2. درج یک رکورد از بین رکوردهای تکراری در جدول موقت ایجاد شده (همون دستور distinct )
3. حذف تمامی داده های جدول اصلی
4. درج داده های جدول موقت در جدول اصلی
فرض کنید جدول اصلی شما دارای سه فیلد UserID و FirstName و LastName هستش که UserID از نوع int و دو فیلد دیگه از نوع Nvarchar باشند.
جدول موقت شما هم باید 3 فیلد (با نام های دلخواه) داشته باشه که همنوع فیلدهای جدول اصلی باشند (یکی از نوع int و دو فیلد دیگه از نوع Nvarchar ).
با این توضیحات کد رو میزام :
تذکر : قبل از اجرای کد زیر حتما از دیتابیس و جداولتون backup تهیه کنید. چراکه در حین اجرای کدها ممکنه به هردلیلی sql server از سرویس دهی خارج بشه و داده ها بصورت کامل بر روی جداول اعمال نشن.


create table #TempTable
(
id int,
name nvarchar(50),
family nvarchar(50)
)
insert into #TempTable select distinct * from TblTest
delete from TblTest
insert into TblTest select * from #TempTable
موفق باشید.

tooraj_azizi_1035
شنبه 17 فروردین 1392, 13:41 عصر
لینک رو خوندی؟
How to remove duplicate rows from a table in SQL Server (http://support.microsoft.com/kb/139444)

hossein_sh2008
یک شنبه 18 فروردین 1392, 22:11 عصر
لینک رو خوندی؟
How to remove duplicate rows from a table in SQL Server (http://support.microsoft.com/kb/139444)

ممنون دوست عزیز ولی چیزی دستگیرم نشد
فکر کنم بهترین راه همون حذف هردو و اضافه کردن یکی از اونها هستش

RED-C0DE
دوشنبه 19 فروردین 1392, 23:19 عصر
یک روش (برای N رکورد مشابه، رکورد های مشابه با id کمتر رو پاک می کنه) :

DELETE TPers1
FROM Person TPers1,
Person TPers2
WHERE TPers1.id > TPers2.id
AND TPers1.lname = TPers2.lname



روش دیگه (برای 2 رکورد مشابه، رکورد با id کمتر رو پاک می کنه):

DELETE
FROM Person
WHERE id
IN (SELECT id = MIN(id)
FROM Person p
GROUP BY
LName
HAVING COUNT(*) > 1)


---
مثالهای بالا فرض شده ک جدولی با ساختار زیر وجود داره ک شامل چند رکورد با LName تکراری هست:

CREATE TABLE [dbo].[Person](
[id] [int] IDENTITY(1,1) NOT NULL,
[LName] [nvarchar](50) NULL
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO