PDA

View Full Version : حذف رکوردهای تکراری



rostami
چهارشنبه 25 شهریور 1388, 12:06 عصر
یه سوال ساده:

تیبلهای tbl_1 , tbl_2 رو در نظر بگیرین.
tbl_1 دارای 4 تا رکورد هست: 1و2و3و4
tbl_2 دارای 8 رکورد هست: 1و2و3و4و5و6و7و8

چطوری میشه رکوردهای tbl_1 را (1و2و3و4) از tbl_2 حدف کرد؟

محمد سلیم آبادی
چهارشنبه 25 شهریور 1388, 12:10 عصر
منظورتان در نمایش است یا کلا Delete کرد:



set nocount on
declare @tbl1 table(a int)
declare @tbl2 table(a int)
insert @tbl1 values (1)
insert @tbl1 values (2)
insert @tbl1 values (3)
insert @tbl2 values(1)

select * from @tbl1
except
select * from @tbl2


delete @tbl1
where a in
(
select a from @tbl1
intersect
select a from @tbl2
)






برای اطلاعات بیشتر به پست "Interscect Without INTERSECT" وبلاگم سر بزنید.

rostami
چهارشنبه 25 شهریور 1388, 13:30 عصر
ممنون از شما
مثالی که من زدم فقط یه "مثال" بود. من تو tbl2 بیش از 8000 رکورد دارم که 2000 تا از اون تو tbl1 هم وجود دارند و میخواهم این رکوردهای تکراری tbl2 رو حدف کنم.
ضمنا دستوراتی که نوشتین تو SQL ارور میده

بازم ممنون

محمد سلیم آبادی
چهارشنبه 25 شهریور 1388, 14:02 عصر
برای حذف کردن داده های مشترک/تکراری شما اجبار به مقایسه ی سطرهای دو جدول دارید، که این مقایسه به همان روشی است که در پست اولم ارسال کردم.

اررو دادن به احتمال زیاد مال این است که از SQL Server 2000 استفاده می کنید. اگر اینطور باشد به جای عملگرهای مجموعه ای می توانید از شبیه سازی شده های آن با کمک union بهره ببرید که در همان مقاله ای که گفتم این کار صورت گرفته است.
من این دستورات را در Engin 2008 اجرا کردم سپس پست کردم.

تعداد سطر زیاد مهم نیست، فقط هرچی بیشتر باشد زمان بیشتری برای پردازش احتیاج دارد.

بهنام بهمنی
چهارشنبه 25 شهریور 1388, 15:46 عصر
نيازي به اشتراک گيري نيست همان IN به تنهايي, عملا فقط مشترکها را بر مي گرداند :
به شکل زير



delete @tbl1
where a in (select a from @tbl2)

محمد سلیم آبادی
چهارشنبه 25 شهریور 1388, 16:03 عصر
نيازي به اشتراک گيري نيست همان IN به تنهايي, عملا فقط مشترکها را بر مي گرداند :
به شکل زير



delete @tbl1
where a in (select a from @tbl2)


این موضوع را می دانم.

اگر از subquery مستقیما استفاده کنیم به تعداد سطر جدول اول ما باید جستجو در تعداد سطر جدول دوم انجام بدهیم. ولی اگر در subquery تنها اشتراکات را قرار دهیم در هر بار جستجو تنها از لیست محدود مشترکات بررسی صورت می گیرد.

مثلا اگر در جدول دوم 20 هزار سطر وجود داشته باشد و اشتراک آن جدول با جدول اول 2 هزار باشد. ما با داشتن اشتراک آنها تنها در 2000 سطر جستجو خواهیم داشت در غیر اینصورت باید در تعداد 20 هزار سطر برای هر سطر جدول اول جستجو کنیم.

بهنام بهمنی
چهارشنبه 25 شهریور 1388, 16:17 عصر
حرف شما کاملا صحيح است به شرطي که جدول بيروني چيزي جداي از دو جدول داخلي باشد مثلاِ کد زير

Delete tbl3 a in
(
select a from @tbl1
intersect
select a from @tbl2
)
ام در حال حاضر چون دو جدول يکي هستند, به نظر مي رسد همان يک In کافي باشد.

محمد سلیم آبادی
چهارشنبه 25 شهریور 1388, 16:21 عصر
به هر حال برای زیبایی کار و علاقه به عملگر های مجموعه ای (Set Operation) این کار را انجام داده ام.

بهنام بهمنی
چهارشنبه 25 شهریور 1388, 16:25 عصر
شما کارت درسته:تشویق: