|
SQL egy- vagy többtáblás lekérdezések távolítják el a duplikált rekordokat Egyetlen tábla különálló - select distinct 字段 from 表
Kód másolása
Sok szavazat csoportosítva A by csoportot a Order by és limit előtt kell elhelyezni, különben hiba jelenthető ************************************************************************************ 1. Keresse meg a felesleges duplikált rekordokat a táblázatban, és a duplikált rekordokat egyetlen mező (peopleId) alapján ítélik meg. Válassz * Emberekből ahol peopleId in (válassz emberekId-et az emberekcsoportból az emberekId-en, ha az emberek száma (emberekId) > 1) 2. Töröljük a táblázatból a redundáns duplikált rekordokat, és a duplikált rekordokat egyetlen mező (peopleId) alapján ítélik meg, így csak a legkisebb rowid rekordok maradnak Törlés az emberekről ahol peopleId in (válassz emberekId-et az emberekcsoportból az emberekId-en, ha az emberek száma (emberekId) > 1) és rowid not in (min(rowid) az emberek csoportból kiválasztva az emberekId száma (peopleId) szerint>1) 3. Keress felesleges duplikált rekordokat (több mezőt) a táblázatban Válassz * a vitae a-ból ahol (a.peopleId,a.seq) in (válassz emberekId,seq az életrajzcsoportból népcsoportok szerint, szek, amelynek száma (*) > 1) 4. Töröld a táblázatból a redundáns duplikált rekordokat (több mezőt), így csak a legkisebb rowid rekordok maradnak Töröld a vitae a-ból ahol (a.peopleId,a.seq) in (válassz emberekId,seq az életrajzcsoportból népcsoportok szerint, szek, amelynek száma (*) > 1) és rowid nem in (min(rowid) válaszd a vitae csoportból peopleId, seq with count(*)>1) 5. Keress felesleges duplikált rekordokat (több mezőt) a táblázatban, és ne tartalmazzon olyan rekordokat, amelyek a legkevésbé rosszul rendelkeznek Válassz * a vitae a-ból ahol (a.peopleId,a.seq) in (válassz emberekId,seq az életrajzcsoportból népcsoportok szerint, szek, amelynek száma (*) > 1) és rowid nem in (min(rowid) válaszd a vitae csoportból peopleId, seq with count(*)>1)
(kettő) Például Az A táblázatban van egy "név" mező, És a "név" értéke ugyanaz lehet a különböző rekordok között, Most olyan tételeket kell kérni, amelyeknek duplikált "név" értékei vannak a táblázatban lévő rekordok között; Válassz Név, Szám(*) Csoportból Név alapján, amelynek Száma (*) > 1 Ha a nem is ugyanaz, az a következő: Válassz nevet, nemet, számot (*) a csoportból név szerint, nemi szám alapján(*) > 1 (három) 1. módszer deklarare @max egész számot@id egész számot cur_rows kurzort helyi kijelölni a főmező kiválasztásához, count(*) a tábla névcsoportból fő mező szerint, amelynek count(*) >; 1 Nyisd meg cur_rows Hozd cur_rows @id,@max míg @@fetch_status=0 Kezdeni select @max = @max -1 Állítsd be a sorszámot @max Töröld a tábla nevét, ahol elsődleges mező = @id Hozd cur_rows @id,@max vége Közel cur_rows Sorszám 0 beállítása 2. módszer A "duplikált rekordoknak" két jelentése van a duplikált rekordoknak: az egyik teljesen duplikált rekord, vagyis egy olyan rekord, amelyben minden mező duplikált, a másik pedig olyan rekord, amelynek kulcsmezők részei duplikáltak, például a Név mező duplikált, míg más mezők nem feltétlenül duplikáltak vagy figyelmen kívül hagyhatók. 1. Az első ismétléstípus esetében viszonylag könnyű megoldani és használni select distinct * from tableName Az eredményt úgy is megkaphatod, hogy nincs ismétlődő rekord. Ha duplikált rekordokat kell törölned (egy duplikált rekordot tartanod), akkor ezeket a következőképpen törölheted select distinct * into #Tmp from tableName drop table tableName a * a tableName betűbe válassz #Tmp Dobd le az asztalt #Tmp Ez a duplikálás a rossz táblázattervezés miatt történik, és egyedi indexoszlopok hozzáadásával oldható meg. 2. Ez a típusú duplikált probléma általában megköveteli, hogy az első bejegyzést megőrizzük a duplikált rekordban, és a műveleti módszer a következő Tegyük fel, hogy vannak duplikált mezők a Név és Cím, és ehhez a két mezőhöz egyedi eredményhalmazt kell kapnod select identity(int,1,1) autoID-ként, * #Tmp a tableName válassza ki min(autoID) autoID-ként #Tmp2 #Tmp csoportból név, autoID alapján select * from #Tmp where autoID in (select autoID from #tmp2) Az utolsó kiválasztás kapja a név és cím eredményhalmazát, amelyek nem ismétlődnek meg (de van egy további autoID mező, amely íráskor a select klauzulába írható) (4) A lekérdezések duplikálódnak Válassz * from Tablename, ahol az ID (select ID from TableName Csoport azonosító szerint a count(id) > 1 ) 3. Keress felesleges duplikált rekordokat (több mezőt) a táblázatban Válassz * a vitae a-ból ahol (a.peopleId,a.seq) in (válassz emberekId,seq az életrajzcsoportból népcsoportok szerint, szek, amelynek száma (*) > 1) A futtatás problémákat okoz, és az írás és küldés, mint például a hely(a.peopleId, a.seq) nem működik!!
|