حذف ردیفهای تکراری در SQL Server: راهنمای جامع بدون کلید اصلی
مدیریت ردیفهای تکراری در جداول پایگاه داده SQL Server، به ویژه زمانی که جدول فاقد کلید اصلی (Primary Key) است، میتواند چالشبرانگیز باشد. این راهنما روشهای کارآمد و بهینهای را برای شناسایی و حذف این ردیفها ارائه میدهد.
برای شناسایی ردیفهای تکراری، میتوانید از توابع COUNT()
و GROUP BY
استفاده کنید. این روش به شما امکان میدهد تا ردیفهایی را که بر اساس ستونهای مشخصی تکرار شدهاند، پیدا کنید:
SELECT ID, COL1, COL2, COUNT(*)
FROM TABLE1
GROUP BY ID, COL1, COL2
HAVING COUNT(*) > 1
پس از شناسایی ردیفهای تکراری، اکنون به بررسی روشهای حذف آنها میپردازیم.
۱. استفاده از جدول موقت (Temporary Table)
یکی از روشهای حذف رکوردهای تکراری در غیاب کلید اصلی، استفاده از یک جدول موقت است. این روش شامل گامهای زیر است:
ابتدا، یک جدول موقت ایجاد کنید. میتوانید یک کلید اصلی برای این جدول موقت تعریف کنید که شامل ستونهای مورد نظر برای تعیین یکتایی ردیفها باشد:
CREATE TABLE #TempTable
(
ID INT,
COL1 VARCHAR(20),
COL2 VARCHAR(20),
PRIMARY KEY (ID, COL1, COL2) -- اختیاری
)
سپس، رکوردهای یکتا (Distinct) را از جدول اصلی خود انتخاب کرده و در جدول موقت وارد کنید:
INSERT INTO #TempTable (ID, COL1, COL2)
SELECT DISTINCT ID, COL1, COL2 FROM TABLE1
در ادامه، جدول اصلی خود را خالی (Truncate) کنید تا تمام رکوردهای آن حذف شوند. این مرحله سریعتر از حذف ردیف به ردیف است:
TRUNCATE TABLE TABLE1
حالا، رکوردهای یکتا را از جدول موقت به جدول اصلی بازگردانید:
INSERT INTO TABLE1 (ID, COL1, COL2)
SELECT ID, COL1, COL2 FROM #TempTable
در نهایت، جدول موقت را حذف کنید، زیرا دیگر به آن نیازی ندارید:
DROP TABLE #TempTable
۲. استفاده از عبارت جدول مشترک (CTE) با تابع ROW_NUMBER()
یکی دیگر از روشهای مؤثر برای حذف ردیفهای تکراری، استفاده از عبارت جدول مشترک (CTE) در کنار تابع پنجرهای ROW_NUMBER()
است. این روش به شما امکان میدهد تا ردیفهای تکراری را شناسایی کرده و حذف کنید.
تابع ROW_NUMBER()
یک شماره ردیف متوالی به هر سطر در یک پارتیشن (Partition) از مجموعه نتایج اختصاص میدهد. با استفاده از عبارت PARTITION BY
، شما میتوانید گروهی از ستونها را مشخص کنید که بر اساس آنها تکراری بودن ردیفها بررسی شود. سپس، با ORDER BY
میتوانید ترتیب شمارهگذاری را تعیین کنید.
برای حذف ردیفهای تکراری با این روش، میتوانید از کوئری زیر استفاده کنید:
WITH CTE (COL1, COL2, COL3, DuplicateCount)
AS
(
SELECT COL1, COL2, COL3,
ROW_NUMBER() OVER(PARTITION BY COL1, COL2, COL3 ORDER BY COL1) AS DuplicateCount
FROM TABLE1
)
DELETE FROM CTE
WHERE DuplicateCount > 1