Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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
Özgün 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.
1. Yöntem
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.
2. Yöntem
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çinROW_NUMBERişlevini kullanır. - 1'den büyük bir
DupRankdeğ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 silmek için 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 basit 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şiminiGROUP BYkullanarak tüm yinelenen kayıtları döndüren bir alt sorgu kullanarak). - En iyi performans için, tabloda dizin anahtarı olarak öğesini
key_valuekullanan ve ifadedeORDER BYkullanmış olabileceğiniz sıralama sütunlarını içeren karşılık gelen bir dizininiz olmalıdır.
Ancak bu yöntem, SQL Server'ın ROW_NUMBER işlevini desteklemeyen eski sürümlerinde çalışmaz. Bu durumda, bunun yerine Yöntem 1 veya benzer bir yöntem kullanmanız gerekir.