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.
Özgün ürün sürümü: SQL Server
Özgün KB numarası: 70956
Özet
Bu makalede, Transact-SQL (T-SQL) betiği kullanarak Microsoft SQL Server'daki bir tablodan yinelenen satırların nasıl kaldırılacağı gösterilmektedir. İki yaygın yöntem açıklanır: yinelenen her satırın bir örneğini ayrı bir tabloya kopyalama ve ROW_NUMBER işlevini kullanarak ek satırları yerinde silme. Tablo yinelenen kayıtlar içeriyorsa, örneğin benzersiz bir kısıtlaması veya birincil anahtarı olmadığı için bu maddeyi kullanın. Yöntem 2, yerinde işlem yaptığı için daha basittir.
Yinelenen satırlar içeren örnek bir tablo oluşturun
Her iki yöntemi de göstermek için, key_value adlı, original_table adlı tek sütunu olan örnek bir tablo oluşturun ve yinelenen veriler ekleyin:
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öntemlerden birini kullanın.
Note
Bu betikler verileri kalıcı olarak siler. Tabloyu veya veritabanını, bunları üretim verilerine karşı çalıştırmadan önce yedekleyin.
Yöntem 1: Yinelenen satırları ayrı bir tabloya taşıma ve bir kopyayı yeniden ekleme
Yöntem 1, iki tablo kullanır: original_table ve betiğin oluşturup sonra sildiği ikinci bir tablo, duplicate_table. Betiği başka bir tabloya uygulamak için original_table öğesini tablo adıyla değiştirin. Bu yöntem, bir yineleme birden fazla sütun tarafından tanımlanıyorsa COUNT ve GROUP BY mantığının yeniden yazılmasını gerektirir.
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 yinelenen satırlardan birini yinelenenler 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 tabloyu kaldırır.
Bu yöntem basittir. Ancak, yinelenen tablosunu geçici olarak oluşturmak için veritabanında yeterli alana sahip olmanız gerekir. Bu yöntem ayrıca verileri taşıdığınız için ek yük oluşturur.
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: Yinelenen satırları silmek için ROW_NUMBER işlevini kullanın
Microsoft SQL Server 2005'te kullanıma sunulan ROW_NUMBER işlevi, bu işlemi çok daha basit hale getirir.
key_value öğesini, yinelenen öğeyi tanımlayan sütun veya sütunlarla değiştirin.
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:
- Verileri, virgülle ayrılmış bir veya daha fazla sütundan oluşabilen
key_valueöğesine göre bölümlemek 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.
(SELECT NULL) ifadesi nedeniyle 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 ORDER BY ifadesini kullanabilirsiniz.
Yinelenenleri kaldırdığınızda en son satırı tutun
Satırı en son değerle tutmak için bu sütuna göre azalan düzende sıralayın. Örneğin, aynı çalışan için birden fazla satırı olan varsayımsal bir employee_table göz önünde bulundurun. Aşağıdaki betik yalnızca en son updated_date değere sahip satırı tutar:
DELETE T
FROM
(
SELECT *
, DupRank = ROW_NUMBER() OVER (
PARTITION BY employee_name
ORDER BY updated_date DESC
)
FROM employee_table
) AS T
WHERE DupRank > 1
En son updated_date değere sahip satırın DupRank değeri 1 olur, bu nedenle betik bu satırı tutar ve eski satırları siler.
Yöntem 2 neden önerilir?
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,
GROUP BYveHAVINGbirleşimini kullanarak tüm yinelenen kayıtları döndüren bir alt sorgu kullanarak). - En iyi performans için, tabloda dizin anahtarı olarak
key_valueöğesini kullanan veORDER BYifadesinde kullanmış olabileceğiniz sıralama sütunlarını içeren karşılık gelen bir dizininiz olmalıdır.
ROW_NUMBER işlevi, SQL Server 2005 ve sonraki sürümlerde kullanılabilir.
ROW_NUMBER işlevini desteklemeyen bir SQL Server sürümü kullanıyorsanız, bunun yerine Yöntem 1'i veya benzer bir yöntemi kullanın.
Tabloda yinelenen satırları nasıl önleyebilirim?
Yinelenenleri kaldırdıktan sonra, bir satırı tanımlayan sütun veya sütunlarda benzersiz kısıtlama veya benzersiz dizin tanımlayarak yeni yinelenen satırları önlemeye yardımcı olabilirsiniz.