Komut dosyası kullanarak SQL Server tablosundan yinelenen satırları kaldırma

Bu makalede, Microsoft SQL Server'daki bir tablodan yinelenen satırları kaldırmak için kullanabileceğiniz bir komut dosyası sağlanır.

Özgün ürün sürümü: SQL Server
Orijinal KB numarası: 70956

Özet

SQL Server tablosundan yinelenen kayıtları silmek için kullanabileceğiniz iki yaygın yöntem vardır. İspat için örnek bir tablo ve veri oluşturarak başlayın:

CREATE TABLE original_table (key_value int )

INSERT INTO original_table values (1)
INSERT INTO original_table values (1)
INSERT INTO original_table values (1)

INSERT INTO original_table values (2)
INSERT INTO original_table values (2)
INSERT INTO original_table values (2)
INSERT INTO original_table values (2)

Ardından, yinelenen satırları tablodan kaldırmak için aşağıdaki yöntemleri deneyin.

Yöntem 1

Aşağıdaki komut dosyasını çalıştırın:

SELECT DISTINCT *
INTO duplicate_table
FROM original_table
GROUP BY key_value
HAVING COUNT(key_value) > 1

DELETE original_table
WHERE key_value
IN (SELECT key_value
FROM duplicate_table)

INSERT original_table
SELECT *
FROM duplicate_table

DROP TABLE duplicate_table

Bu komut dosyası, aşağıdaki eylemleri verilen sırayla gerçekleştirir:

  • Özgün tablodaki herhangi bir yinelenen satırın örneğini bir yinelenen tablosuna taşır.
  • Yinelenen tablosunda bulunan tüm satırları, özgün tablodan siler.
  • Yinelenen tablosundaki satırları özgün tabloya geri taşır.
  • Yinelenen tablosunu siler.

Bu yöntem basittir. Ancak, yinelenen tablosunu geçici olarak oluşturmak için veritabanında yeterli alana sahip olmanız gerekir. Verileri taşıdığınız için bu yöntem de ek yüke neden olur.

Ayrıca, tablonuzda bir IDENTITY sütunu varsa verileri özgün tabloya geri yüklerken SET IDENTITY_INSERT ON kullanmanız gerekir.

Yöntem 2

Microsoft SQL Server 2005'te sunulan ROW_NUMBER işlevi bu işlemi çok daha basit hale getirir:

DELETE T
FROM
(
SELECT *
, DupRank = ROW_NUMBER() OVER (
              PARTITION BY key_value
              ORDER BY (SELECT NULL)
            )
FROM original_table
) AS T
WHERE DupRank > 1 

Bu komut dosyası, aşağıdaki eylemleri verilen sırayla gerçekleştirir:

  • Virgülle ayrılmış bir veya daha fazla sütun olan key_value öğesine dayanan verileri bölümlendirmek için ROW_NUMBER işlevini kullanır.
  • 1'den büyük bir DupRank değeri alan tüm kayıtları siler. Bu değer, kayıtların yinelenen olduğunu gösterir.

İfade nedeniyle (SELECT NULL) betik bölümlenmiş verileri herhangi bir koşula göre sıralamaz. Yinelenenleri silme mantığınız hangi kayıtların silineceği ve diğer sütunların sıralama düzenine göre hangilerinin tutulabileceğinin seçilmesini gerektiriyorsa, bunu yapmak için ifadeyi ORDER BY kullanabilirsiniz.

Daha fazla bilgi

Yöntem 2 şu nedenlerle basittir ve etkilidir:

  • Yinelenen kayıtları geçici olarak başka bir tabloya kopyalamanızı gerektirmez.
  • Özgün tabloyu kendisiyle birleştirmenizi gerektirmez (örneğin, ve HAVINGbirleşimini GROUP BY kullanarak tüm yinelenen kayıtları döndüren bir alt sorgu kullanarak).
  • En iyi performans için, tabloda dizin anahtarı olarak öğesini key_value kullanan ve ifadede ORDER BY kullanmış olabileceğiniz sıralama sütunlarını içeren karşılık gelen bir dizininiz olmalıdır.

Ancak bu yöntem, ROW_NUMBER işlevini desteklemeyen eski SQL Server sürümlerinde çalışmaz. Bu durumda, bunun yerine Yöntem 1 veya benzer bir yöntem kullanmanız gerekir.