SQL Server Tablosundan Yinelenen Satırlar Nasıl Kaldırılır?
SQL Server'da nesneler tasarlarken belirli en iyi uygulamaları izlemeliyiz. Örneğin, bir tablo birincil anahtarlara, kimlik sütunlarına, kümelenmiş ve kümelenmemiş dizinlere, veri bütünlüğüne ve performans kısıtlamalarına sahip olmalıdır. Veritabanı tasarımındaki en iyi uygulamalara göre SQL Server tablosu yinelenen satırlar içermemelidir. Ancak bazen, bu kurallara uyulmadığında veya bu kurallar kasıtlı olarak atlandığında istisnaların mümkün olduğu veritabanlarıyla ilgilenmemiz gerekir. En iyi uygulamaları takip ediyor olsak da, yinelenen satırlar gibi sorunlarla karşılaşabiliriz.
Örneğin, ara tabloları içe aktarırken bu tür verileri de alabiliriz ve fazlalık satırları üretim tablolarına fiilen eklemeden önce silmek isteriz. Ayrıca, yinelenen bilgiler isteklerin birden çok işlenmesine, yanlış raporlama sonuçlarına ve daha fazlasına izin verdiğinden, satırları çoğaltma ihtimalini bırakmamalıyız. Bununla birlikte, sütunda zaten yinelenen satırlar varsa, yinelenen verileri temizlemek için belirli yöntemleri izlememiz gerekir. Veri yinelemesini kaldırmak için bu makaledeki bazı yollara bakalım.
SQL Server Tablosundan Yinelenen Satırlar Nasıl Kaldırılır?
SQL Server'da, aşağıdaki gibi belirli koşullara dayalı olarak bir tablodaki yinelenen kayıtları işlemenin birkaç yolu vardır:
Benzersiz bir dizin SQL Server tablosundan yinelenen satırları kaldırma
Dizini, yinelenen verileri benzersiz dizin tablolarında sınıflandırmak için kullanabilir, ardından yinelenen kayıtları silebilirsiniz. İlk önce, ihtiyacımız var bir veritabanı oluştur "test_database" adlı, ardından aşağıda verilen kodu kullanarak benzersiz bir dizine sahip bir "Çalışan" tablosu oluşturun.
Ana GO CREATE DATABASE test_database KULLANIN GİT KULLAN [test_database] GO CREATE TABLE Employee ([ID] INT NOT NULL IDENTITY (1,1), [Dep_ID] INT, [Ad] varchar (200), [email] varchar (250) NULL , [şehir] varchar (250) NULL, [adres] varchar (500) NULL CONSTRAINT Primary_Key_ID PRIMARY ANAHTAR (ID))
Çıktı aşağıdaki gibi olacaktır.
Şimdi verileri tabloya ekleyin. Yinelenen satırları da ekleyeceğiz. "Dep_ID" 003,005 ve 006, benzersiz bir anahtar indeksine sahip kimlik sütunu hariç tüm alanlarda benzer verilere sahip yinelenen satırlardır. Aşağıda verilen kodu yürütün.
KULLANIN [test_database] KULLANIN EKLE Çalışan(Dep_ID,Ad,e-posta,şehir,adres) DEĞERLER (001, 'Aaaronboy Gutierrez', '[email protected]','HILLSBORO','5840 Ne Cornell Rd Hillsboro veya 97124 '), (002,' Aabdi Maghsoudi ',' [email protected] ',' BRENTWOOD ',' 987400 Nebraska Tıp Merkezi Omaha Ne 681987400 '), (003,' Aabharana, Sahni ',' abharana.sahni@gmail. com ',' HYATTSVILLE ',' 2 Barlo Circle Suite A Dillsburg Pa 170191 '), (003,' Aabharana, Sahni ',' [email protected] ',' HYATTSVILLE ',' 2 Barlo Circle Suite A Dillsburg Pa 170191 '), (004,' Aabish Mughal ',' [email protected] ',' OMAHA ',' 2975 Crouse Lane Burlington Nc 272150000 '), (005,' Aabram Howell ','[email protected] ',' DILLSBURG ',' 868 York Ave Atlanta Ga 303102750 '), (005,' Aabram Howell ',' [email protected] ',' DILLSBURG ',' 868 York Ave Atlanta Ga 303102750 '), (006 , 'Humbaerto Acevedo', '[email protected]', 'SAINT PAUL', '895 E 7th St Saint Paul Mn 551063852'), (006, 'Humbaerto Acevedo', 'humbaerto.ac [email protected] ',' SAINT PAUL ',' 895 E 7th St Saint Paul Mn 551063852 '), (007,' Pilar Ackaerman ',' [email protected] ',' ATLANTA ',' 5813 Eastern Ave Hyattsville Md 207822201 '); Çalışandan * SEÇ
Çıktı aşağıdaki gibi olacaktır.
Şimdi aşağıdaki kodu çalıştırarak tablodaki satır sayısını bulun. Count (*) işlevi, satır saymaz.
Dep_ID, Ad, e-posta, şehir, adres, COUNT (*) OLARAK duplicate_rows_count SEÇİN Dep_ID, Ad, e-posta, şehir, adres
Çıktı aşağıdaki gibi olacaktır. Kırmızı kutuda vurgulanan (3, 4), (6, 7), (8, 9) numaralı satırlar birbirinin kopyasıdır.
Görevimiz, yinelenen sütunlar için yinelemeleri kaldırarak benzersizliği sağlamaktır. Benzersiz bir indeksle yinelenen değerleri tablodan kaldırmak, satırları onsuz bir tablodan kaldırmaktan biraz daha kolaydır. Aşağıda, bunu başarmak için iki yöntem verilmiştir. İlk yöntem, “row_number()” işlevini kullanarak tablodan yinelenen satırlar verirken, ikinci yöntem “NOT IN” işlevini kullanır. Bu iki yöntemin, daha sonra tartışılacak olan kendi maliyetleri vardır.
Yöntem 1: "ROW_NUMBER ()" işlevini kullanarak yinelenen kayıtları seçme
(SELECT Dep_ID, Name, email, city, address, ROW_NUMBER () OVER (PARTITION BY Dep_ID, Name, email, city, address BY Dep_ID, Name, email, city, address) row_no FROM test_database.dbo.Employee ) x burada row_no> 1
Yöntem 2: "NOT IN ()" işlevini kullanarak yinelenen kayıtları seçme
SEÇİN * test_database.dbo.Employee NEREDE KİMLİĞİ BULUNMADI (test_database.dbo'dan MAKS (KİMLİK) SEÇİN. Dep_ID, İsim, e-posta, şehir, adres)
Yukarıdaki kodu çalıştırın ve aşağıdaki çıktıyı göreceksiniz. Her iki yöntem de aynı sonucu verir, ancak farklı maliyetleri vardır.
Şimdi, aşağıdaki kodu kullanarak “CTE” kullanarak yukarıda seçilen yinelenen satırları sileceğiz. Aşağıdaki kod, "ROW_NUMBER ()" işlevi kullanılarak silinecek yinelenen satırları seçiyor.
Yöntem 1: "ROW_NUMBER ()" işlevini kullanarak yinelenen kayıtları silme
Cte_delete AS İLE (SEÇİN Dep_ID, Ad, e-posta, şehir, adres, ROW_NUMBER () ÜSTÜ (DEPO_ID TARAFINDAN BÖLÜMLEME, Ad, e-posta, şehir, adres SİPARİŞE GÖRE Dep_ID, Ad, e-posta, şehir, adres) row_no: test_database.dbo.Employee ) Cte_delete'DEN SİLİN: row_no> 1;
Çıktı aşağıdaki gibi olacaktır.
Yöntem 2: "NOT IN ()" işlevini kullanarak yinelenen kayıtları silme
Şimdi başka bir yöntemi test etmek için, tablodan tüm satırları kaldıracak olan tabloyu kısaltmamız gerekiyor. Daha sonra insert komutu tabloya değerler ekleyecektir. Aşağıdaki kodu şimdi yürütün.
KULLANIN [test_database] GO kesme tablosu test_database.dbo.Employee INSERT INTO Employee (Dep_ID, Name, email, city, address) VALUES (001, 'Aaaronboy Gutierrez', '[email protected]', 'HILLSBORO', ' 5840 Ne Cornell Rd Hillsboro Or 97124 '), (002,' Aabdi Maghsoudi ',' [email protected] ',' BRENTWOOD ',' 987400 Nebraska Medical Center Omaha Ne 681987400 '), (003,' Aabharana, Sahni ', '[email protected]', 'HYATTSVILLE', '2 Barlo Circle Suite A Dillsburg Pa 170191'), (003, 'Aabharana, Sahni', '[email protected]', 'HYATTSVILLE', ' 2 Barlo Circle Suite A Dillsburg Pa 170191 '), (004,' Aabish Mughal ',' [email protected] ',' OMAHA ',' 2975 Crouse Lane Burlington Nc 272150000 '), (005,' Aabram Howell ',' [email protected] ',' DILLSBURG ',' 868 York Ave Atlanta Ga 303102750 '), (005,' Aabram Howell ',' [email protected] ',' DILLSBURG ',' 868 York Ave Atlanta Ga 303102750 '), (006,' Humbaerto Acevedo ',' [email protected] ',' SAINT PAUL ',' 895 E 7th St Saint Paul Mn 551063852 ' ), (006, 'Humbaerto Acevedo', '[email protected]', 'SAINT PAUL', '895 E 7th St Saint Paul Mn 551063852'), (007, 'Pilar Ackaerman', 'pilar.ackaerman @ gmail.com ',' ATLANTA ',' 5813 Eastern Ave Hyattsville Md 207822201 '); Çalışandan * SEÇ
Çıktı aşağıdaki gibi olacaktır.
“Çalışan” tablosundan tüm yinelenen satırları silmek için aşağıda verilen kodu yürütün.
ID IN OLMAYAN YERDE test_database.dbo.Employee FROM FROM (Dep_ID,Ad,e-posta,şehir,adrese göre test_database.dbo.Çalışan GRUBU'NDAN MAX(ID) SEÇİN)
Çıktı aşağıdaki gibi olacaktır.
Dizine alınmış tablodan yinelenen satırları silmek için Yürütme Planı ve Sorgu Maliyeti:
Şimdi hangi yöntemin uygun maliyetli olacağını ve daha az kaynak kullanacağını kontrol etmeliyiz. Kodu seçin ve yürütme planına tıklayın. Maliyet yüzdesi ile birlikte tüm yürütme planlarını gösteren aşağıdaki ekran görünecektir.
Yöntem 1 "" ROW_NUMBER () "işlevini kullanarak yinelenen kayıtları silme" nin% 33 maliyete sahip olduğunu ve yöntem 2 "NOT IN () işlevini kullanarak yinelenen kayıtları silmenin"% 67 maliyete sahip olduğunu görebiliriz. Dolayısıyla, birinci yöntem, ikinci yöntemle karşılaştırıldığında en uygun maliyetli olanıdır.
Benzersiz bir dizin olmadan bir SQL Server tablosundan kopyaları kaldırma:
Benzersiz bir dizin olmadan yinelenen satırları veya tabloları kaldırmak biraz daha zordur. Bu senaryoda, ortak bir tablo ifadesi (CTE) ve SATIR NUMARASI () işlevi kullanmak, yinelenen kayıtları kaldırmamıza yardımcı olur. Benzersiz bir indeks olmadan kopyaları tablodan kaldırmak için benzersiz satır tanımlayıcıları oluşturmamız gerekir.
Tabloyu benzersiz bir dizin olmadan oluşturmak için aşağıdaki kodu çalıştırın.
[Test_database] KULLANIN GİT ANSI_NULLS AYARLA GİT GO CREATE TABLE [dbo]. [Employee_with_out_index] ([Dep_ID] [int] NULL, [Ad] [varchar] (200) NULL, [e-posta] [varchar] (250 ) BOŞ, [şehir] [varchar](250) BOŞ, [adres] [varchar](500) BOŞ, ) GO
Çıktı aşağıdaki gibi olacaktır.
Şimdi, aşağıdaki kodu yürüterek kayıtları “Employee_with_out_index” adlı oluşturulan tabloya ekleyin.
[Test_database] KULLANIN INSERT INTO Employee_with_out_index (Dep_ID, Ad, e-posta, şehir, adres) DEĞERLER (001, 'Aaaronboy Gutierrez', '[email protected]', 'HILLSBORO', '5840 Ne Cornell Rd Hillsboro Or 97124 '), (002,' Aabdi Maghsoudi ',' [email protected] ',' BRENTWOOD ',' 987400 Nebraska Tıp Merkezi Omaha Ne 681987400 '), (003,' Aabharana, Sahni ',' abharana.sahni@gmail. com ',' HYATTSVILLE ',' 2 Barlo Circle Suite A Dillsburg Pa 170191 '), (003,' Aabharana, Sahni ',' [email protected] ',' HYATTSVILLE ',' 2 Barlo Circle Suite A Dillsburg Pa 170191 '), (004,' Aabish Mughal ',' [email protected] ',' OMAHA ',' 2975 Crouse Lane Burlington Nc 272150000 '), (005,' Aabram Howell ','[email protected] ',' DILLSBURG ',' 868 York Ave Atlanta Ga 303102750 '), (005,' Aabram Howell ',' [email protected] ',' DILLSBURG ',' 868 York Ave Atlanta Ga 303102750 '), (006 , 'Humbaerto Acevedo', '[email protected]', 'SAINT PAUL', '895 E 7th St Saint Paul Mn 551063852'), (006, 'Humbaerto Acevedo' , '[email protected]', 'SAINT PAUL', '895 E 7th St Saint Paul Mn 551063852'), (007, 'Pilar Ackaerman', '[email protected]', 'ATLANTA', '5813 Eastern Ave Hyattsville Md 207822201'); Employee_with_out_index'DEN SEÇİN *
Çıktı aşağıdaki gibi olacaktır.
Yöntem 1: "ROW_NUMBER ()" işlevini ve JOINS'i kullanarak bir tablodan yinelenen satırları silme.
ROW_NUMBER () işlevini kullanan aşağıdaki kodu çalıştırın ve endeks olmadan yinelenen satırları tablodan kaldırmak için JOIN. BT önce tüm satırlara row_no atamak için benzersiz bir kimlik oluşturur ve yinelenenleri kaldırarak yalnızca bir satırı tutar.
Temp_tablr_with_row_ids İLE (ROW_NUMBER () SEÇİNİZ (SEÇİNİZ (Dep_ID, Ad, e-posta, şehir, adres) AS row_no, Dep_ID, Ad, e-posta, şehir, adres) test_database.dbo.Employee_with_out_index) Temp_tablr_wHER_row_ids FROM ( Temp_tablr_with_row_ids'DEN MAX (satır_no) SEÇİN i NEREDE a.Dep_ID = i.Dep_ID ve a.Name = i.Name ve a.email = i.email ve a.city = i.city ve a.address = i.address GROUP BY Dep_ID, Ad, e-posta, şehir, adres)
Çıktı aşağıdaki gibi olacaktır.
Yöntem 2: "ROW_NUMBER ()" işlevini ve PARTITION BY kullanarak bir tablodan yinelenen satırları silme.
Şimdi, bu yöntemde, satır_no'yu tüm satırlara atamak ve sonra yinelenenleri silmek için, bölüme göre bölümleme ile birlikte ROW_NUMBER işlevini kullanıyoruz. Her şeyden önce, daha önce oluşturduğumuz aynı tabloyu kısaltmamız gerekir, böylece tablodaki tüm veriler silinir. Ardından, yinelenen kayıtları içeren kayıtları tabloya ekleyin. Üçüncü sorgu, "Employee_with_out_index" adlı tablodan yinelenen satırları silecektir.
kesik tablo Employee_with_out_index INSERT INTO Employee_with_out_index (Dep_ID, Name, email, city, address) VALUES (001, 'Aaaronboy Gutierrez', '[email protected]', 'HILLSBORO', '5840 Ne Cornell Rd Hillsboro Or 97124') , (002, 'Aabdi Maghsoudi', '[email protected]','BRENTWOOD','987400 Nebraska Tıp Merkezi Omaha Ne 681987400'), (003, 'Aabharana, Sahni', '[email protected]' , 'HYATTSVILLE', '2 Barlo Circle Suite A Dillsburg Pa 170191'), (003, 'Aabharana, Sahni', '[email protected]', 'HYATTSVILLE', '2 Barlo Circle Suite A Dillsburg Pa 170191' ), (004, 'Aabish Mughal', '[email protected]', 'OMAHA', '2975 Crouse Lane Burlington Nc 272150000'), (005, 'Aabram Howell', '[email protected]', 'DILLSBURG','868 York Ave Atlanta Ga 303102750'), (005, 'Aabram Howell', '[email protected]','DILLSBURG','868 York Ave Atlanta Ga 303102750'), (006, ' Humbaerto Acevedo ',' [email protected] ',' SAINT PAUL ',' 895 E 7th St Saint Paul Mn 551063852 '), (006,' Hu mbaerto Acevedo ',' [email protected] ',' SAINT PAUL ',' 895 E 7th St Saint Paul Mn 551063852 '), (007,' Pilar Ackaerman ',' [email protected] ',' ATLANTA ',' 5813 Eastern Ave Hyattsville Md 207822201 ');
Geçici tabloya yinelenen kayıtları seçme
; İLE temp_tablr_with_row_ids AS ( ROW_NUMBER() ÜZERİNDEN SEÇİN (BÖLÜM BÖLÜMÜ,Ad,e-posta,şehir,adres Dep_ID'YE GÖRE SİPARİŞ,Ad,email,şehir,adres) row_no, Dep_ID,Name,email,city,personel_with_out_index'ten adres)
Geçici tablodan yinelenen kayıtları silme
SİLİN temp_tablr_with_row_ids a WHERE row_no> 1
Çıktı aşağıdaki gibi olacaktır.
Ayrıca, hangisinin optimize edilmiş bir çözüm olduğunu anlamak için sorgu yürütme maliyetlerini bilmemiz gerekir. Bu nedenle ilgili tüm sorguları seçmeniz ve yürütme planına tıklamanız gerekir. Aşağıdaki resim, yürütme maliyeti ile birlikte sorgular için yürütme planını göstermektedir. Sil sorguları kırmızı kutuda vurgulanır. "ROW_NUMBER ()" ve JOIN deyimini kullanan ilk sorgu% 56 yürütme maliyetine sahipken, ikinci sorgu "ROW_NUMBER ()" kullanıyor ve "PARTITION BY"% 31 maliyete sahip. Yani ikinci yöntem daha optimize edilmiş bir yöntemdir ve optimize edilmiş bir çözüm izlemeliyiz.