|
SQL tek/çoklu tablo sorguları tekrarlanan kayıtları kaldırır Tek tablo ayrım - select distinct 字段 from 表
Kopya kodu
Birçok oy gruplara göre Group by ile önce Order by ve limit öncesinde yapılmalıdır, aksi takdirde bir hata bildirilir ************************************************************************************ 1. Tabloda gereksiz tekrarlanan kayıtları bulun ve tekrarlanan kayıtlar tek bir alan (peopleId) üzerinden değerlendirilir. İnsanlardan * Seç wherePeopleId in (peopleId gruptan peopleId'yi seç sayısı (peopleId) > 1) 2. Tablodaki gereksiz tekrarlanan kayıtlar silinir ve tekrarlanan kayıtlar tek bir alana (peopleId) göre değerlendirilir; böylece sadece en küçük rowid olan kayıtlar kalır İnsanlardan sil wherePeopleId in (peopleId gruptan peopleId'yi seç sayısı (peopleId) > 1) ve rowid not in (people group'tan min(rowid) select by peopleId with count(peopleId)>1) 3. Tabloda gereksiz tekrarlanan kayıtları (çoklu alanlar) bulun Vitae A'dan * seç burada (a.peopleId,a.seq) içinde (peopleId,seq gruplarından peopleId,seq seçin, sayısı(*) olan seq sayısı(*) >) 4. Tablodaki tekrarlanan kayıtları (çoklu alanlar) silinerek sadece en küçük sıralı kayıtları bırakın Vitae A'dan sil burada (a.peopleId,a.seq) içinde (peopleId,seq gruplarından peopleId,seq seçin, sayısı(*) olan seq sayısı(*) >) ve rowid not in (vitae grubundan min(rowid) seç peopleId,seq with count(*)>1) 5. Tabloda gereksiz tekrarlayan kayıtlar (çoklu alanlar) bulun ve en az sıradan kayıt içeren kayıtlar içermemektedir Vitae A'dan * seç burada (a.peopleId,a.seq) içinde (peopleId,seq gruplarından peopleId,seq seçin, sayısı(*) olan seq sayısı(*) >) ve rowid not in (vitae grubundan min(rowid) seç peopleId,seq with count(*)>1)
(iki) Örneğin Tablo A'da bir "isim" alanı vardır, Ve "isim" değeri farklı kayıtlar arasında aynı olabilir, Şimdi tablodaki kayıtlar arasında "isim" değerlerinin çoğaltılmış eşyalarını sorgulamanız gerekir; Bir gruptan Ism, Sayı(*) Sayısı 1 olan Bir Gruptan İsme,Sayı(*) Seçin > Eğer cinsiyet de aynıysa, şu şekildedir: İsme, cinsiyet, Sayı(*) Gruptan İsme, Cinsiyet Sayı(*) Sayı(*) Seç > 1 (üç) Yöntem 1 @max tam sayıyı bildirin,@id tam sayı ana alanı seçmek için cur_rows imleci yerel olarak ilan et, count(*) tablo adı grubundan count(*) ile count(*) >; 1 Açık cur_rows cur_rows @id,@max oysa @@fetch_status=0 Başlamak select @max = @max -1 sıra sayısını @max Tablo adından sil, burada birincil alan = @id cur_rows @id,@max Son Yakın cur_rows sıra sayısı 0 Yöntem 2 "Tekrarlanan kayıtlar" iki anlama sahiptir: biri tamamen yikrarlanan kayıttır, yani tüm alanların çoğaltılmış olduğu bir kayıt, diğeri ise anahtar alanların yinelenmiş kısımlarının olduğu kayıttır; örneğin İsim alanı çoğaltılır, diğer alanlar mutlaka çoğaltılabilir veya göz ardı edilebilir. 1. Birinci tür tekrarda çözmek ve kullanmak nispeten kolaydır table Name'den farklı * seç Sonuçlar setini tekrarlayan kayıtlar olmadan alabilirsiniz. Eğer tekrarlanan kayıtları silmeniz gerekiyorsa (1 kopya kayıt tutun), bunları aşağıdaki gibi silebilirsiniz tableName üzerinden farklı * ile #Tmp seç Tablo Bırak TabloAdı * seç ve tablo adına #Tmp Masayı bırak #Tmp Bu çoğaltma kötü tablo tasarımı nedeniyle oluşur ve benzersiz indeks sütunları eklenerek çözülebilir. 2. Bu tür çoğaltma problemi genellikle tekrarlanan kayıttaki ilk kaydın tutulmasını gerektirir ve işlem yöntemi şöyledir Diyelim ki İsim ve Adres gibi tekrarlanan alanlar var ve bu iki alan için benzersiz bir sonuç kümesi elde etmeniz gerekiyor identity(int,1,1) autoID olarak seç, * tableName #Tmp'a min(autoID) seç autoID olarak #Tmp gruptan #Tmp2 için, ism, autoID otoID içinde olan #Tmp içinden * seç (#tmp2'den otomatik ID seç) Son seçim, tekrarlanmayan İsim ve Adres sonuç kümesini alır (ancak yazılırken seçim cümlesinde yazılabilen ek bir otomatik ID alanı vardır) (4) Sorgular tekrarlanır * Table Name'den seçin, burada id içinde (Table Name'den ID seçin Id ile gruplama sayı(id) > 1 ) 3. Tabloda gereksiz tekrarlanan kayıtları (çoklu alanlar) bulun Vitae A'dan * seç burada (a.peopleId,a.seq) içinde (peopleId,seq gruplarından peopleId,seq seçin, sayısı(*) olan seq sayısı(*) >) Koşmak sorun çıkarır ve nerede (a.peopleId, a.seq) gibi yazmak ve göndermek işe yaramayacak!!
|