Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 14609|Yanıt: 0

[İpucu] SQL Bir tabloyu sorgulamak için tekrarları kaldırmak

[Bağlantıyı kopyala]
Yayınlandı 9.10.2014 11:03:04 | | |

SQL tek/çoklu tablo sorguları tekrarlanan kayıtları kaldırır

Tek tablo ayrım

  1. 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!!






Önceki:SQL, parametrelerle depolanmış prosedürler oluşturur
Önümüzdeki:EPUBReader okuyucu, EPUB dosyalarını açmak için mutlaka sahip olmak zorunda bir
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com