PDA

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



hr110
چهارشنبه 14 اردیبهشت 1384, 14:50 عصر
سلام
من چند جدول دارم که یک یا چند فیلد از فیلدها اون باهم یکی هستند و قصد حذف رکوردهای اضافی را دارم. با این پیش فرض که کلید اصلی یا فیلد identity هم تعریف نشده و امکان تعریف هم نیست. تعداد فیلدهای مقایسه ایی ممکن است بیش از یک فیلد باشد.
توجه داشته باشید ممکن است مقدار مابقی فیلدها نیز یکی نباشد، مسئله مهم یکی بودن یک یا چند فیلد است

:)
متشکرم

AminSobati
چهارشنبه 14 اردیبهشت 1384, 19:30 عصر
سلام دوست عزیزم،
ملاک برای تکراری تلقی شدن یک رکورد در اینجا چیه؟ یعنی آیا مقادیر در همه فیلدها باید مشابه باشند تا رکورد از نظر شما تکراری محسوب بشه یا فیلدهای خاصی؟

hr110
پنج شنبه 15 اردیبهشت 1384, 06:00 صبح
تنها یک فیلد یا چند فیلد خاص مقادیر یکسانی دارند (و مابقی فیلدها میتواند یکسان نباشد) و باید براساس این فیلد (یا فیلدها) مقایسه انجام شود.

متشکرم :flower:

AminSobati
پنج شنبه 15 اردیبهشت 1384, 17:31 عصر
دوست عزیزم، یک نکته مهم در اینجا وجود داره:
فرض کنیم دو فیلد، معیار شما باشند. اگر سه رکورد داشته باشیم که مقادیرشون در این دو فیلد، همگی یکسان باشه ولی فیلدهای دیگه اونها متفاوت، بر اساس چه شرط یا ضابطه ای (Where) تصمیم میگیرین که کدوم یک از این سه رکورد باقی بمونه و دوتای دیگه حذف بشن؟ میبایست یک شرط منطقی که در Where بگنجه تامین کنین.

hr110
پنج شنبه 15 اردیبهشت 1384, 18:43 عصر
حرف شما کاملاً منطقی است، برای من تفاوتی نمیکند که کدامیک از این سه رکورد حذف شوند؛ توضیح در مورد اینکه چرا مابقی فیلدها ممکن است یکسان نباشد کمی دشوار است. آیا این مسئله را با این فرضها میتوان با دستورات TSQL حل نمود؟

از توجه شما سپاسگذارم. :flower:

AminSobati
جمعه 16 اردیبهشت 1384, 02:18 صبح
با توجه به این که صورت مسئله کمی خارج از استاندارده(مثلا جداول PK ندارند) جوابش هم چندان سر راست نیست.
به نظر میرسه شما به یک Cursor نیاز دارین که تمام جدول رو از بالا تا پایین Scan کنه. زمانی که مثلا روی رکورد اول قرار دارین، مقدار اون دو فیلد رو برداره و یک Query انجام بده که مشخص بشه آیا رکوردهای دیگه ای هم با همین مقادیر وجود دارند یا خیر. اگر تعداد رکوردهای موجود که مقدار فیلدشون با مقدار برداشته شده یکسانه بیشتر از یکی بود، رکورد جاری (که در Cursor روی اون قرار گرفتیم) حذف میشه. مثلا در جدول زیر، فرض میکنیم اگر دو رکورد در فیلدهای C2 و C3 مقدارشون یکسان بود، یکیشون تکراری تلقی میشه:

CREATE TABLE T1(
C1 INT,
C2 INT,
C3 INT)

INSERT T1 VALUES(3,4,4)
INSERT T1 VALUES(2,2,4)
INSERT T1 VALUES(1,4,4)
INSERT T1 VALUES(4,2,4)
INSERT T1 VALUES(13,4,0)
INSERT T1 VALUES(3,65,0)
INSERT T1 VALUES(5,65,0)

GO

DECLARE @C2 INT,@C3 INT, @COUNTER INT
DECLARE MYC CURSOR DYNAMIC FOR SELECT C2,C3 FROM T1 FOR UPDATE
OPEN MYC
FETCH NEXT FROM MYC INTO @C2, @C3

WHILE @@FETCH_STATUS =0
BEGIN
SELECT @COUNTER=COUNT(*) FROM T1 WHERE C2=@C2 AND C3=@C3
IF @COUNTER>1 DELETE T1 WHERE CURRENT OF MYC
SET @COUNTER=0
FETCH NEXT FROM MYC INTO @C2, @C3
END

CLOSE MYC
DEALLOCATE MYC

موفق باشید