|
Microsoft Office Access |
|
|
Uklanjanje duplikataNivo:
Problem dupliranih unosa može biti veći nego što se naizgled čini. Bilo da je reč o lošoj relacionoj strukturi koja dozvoljava dupliranje podataka ili, češće, o prenosu podataka iz drugog formata, duplirane podatke treba filtrirati i ukloniti. Naime, korisnici često vode određenu evidenciju u tabelarnoj formi upotrebom Excela. Kako ovaj program nema jednostavan mehanizam za obezbeđivanje od unosa duplikata, pojavljuju se duplirani unosi. Često se dešava i da korisnik unosi podatke upotrebom dve ili više Excel datoteka sa istovetnom strukturom, gde se pojedini podaci možda ponavljaju. Svejedno da li je dupliran samo jedan zapis ili više njih, to morate ukloniti pre unosa u radnu tabelu Accessa. Upotrebom čarobnjaka Find Unmatched Query Wizard lako možete doći do podataka koji se ponavljaju. Drugi korak čarobnjaka, gde određujete da li želite da se prikaže i dodatno polje osim onog u kome se nalazi dupliran podatak, određuje način po kojem ćete videti duplirane podatke. Za ovo dodatno polje koristite tip AutoNumber, jer je to siguran način da identifikujete tačno određen zapis. Na prvoj slici, pod brojem 1 je obeležen upit nastao radom čarobnjaka za pronalaženje duplikata u kome je u upit dodato ID polje. Pod brojem 2 je obeležen upit nastao radom ovog čarobnjaka kada nije dodato nijedno drugo polje. Da bismo problem načinili kompleksnijim, načinili smo tabelu sa dve kolone po kojima tražimo duplikate. Ponekad je potrebno ukloniti duplikate podataka po svim kolonama, a nekada samo one koji se pojavljuju u pojedinim kolonama. Primetite na slici da upit broj 1 možete pretvoriti u Delete upit - onaj koji briše podatke, a upit broj 2 ne. Drugi upit samo vraća informaciju o broju dupliranih zapisa (193114 se pojavljuje tri puta, dok se 286468 pojavljuje dvaput). Da biste dobili broj, koristite upit sa sumiranjem podataka koji u poslednjoj koloni upotrebljavs funkciju Count. Brisanje podataka ovim upitom nije moguće jer Access grupiše podatke, pa jedan zapis upita ne odgovara tačno jednom zapisu tabele. Ako biste pokušali da izbrišete podatak 193114, Access ne bi znao koji tačno zapis želite da izbrišete - prvi, drugi, treći ili sve? Kako nedoumice u destruktivnoj operaciji brisanja ne smeju da postoje, tada ni brisanje upitom za sumiranje podataka nije moguće. Pitanje je - šta sad? Na primeru imamo mali broj zapisa, pa se duplikati mogu ručno ukloniti. Kad raspolažemo sa velikim skupom podataka, ručno brisanje jednostavno nije moguće. Ako od prvog upita načinite upit za brisanje podataka, on će izbrisati sve duplikate, tj. ukloniće sva tri zapisa 193114, iako bi barem jedan od njih, kao jedinstven zapis, trebalo da ostane. Jedna od ideja naizgled deluje komplikovano: iz liste duplikata treba izdvojiti prvi jedinstven zapis i onda, upotrebom ovog upita, treba filtrirati listu duplikata tako da preostane drugi, treći..., itd. duplikat.
Pokušajte: upotrebite upit 1, uključite sumiranje rezultata, pa u koloni IDUnos odaberite First za način sumiranja (osnovno je GroupBy). Upit vraća rezultat kao na drugoj slici. Sledeći korak je da izdvojite stvarne duplikate: upotrebite upit 1 i poslednji upit, a zatim formirajte upit kao na sledećoj slici.
Rečima opisano, ovaj upit vraća sve one podatke koji se pojavljuju u upitu 1, ali samo one koji se ne pojavljuju u upitu kojim se izdvajaju prvi zapisi među duplikatima. Pokretanjem upita, videćete zapise IDUnos sa brojevima 5, 8 i 9. Deluje ohrabrujuće: pronašli ste one zapise koji su duplikati, a iz liste ste izdvojili samo prvi od svakog dupliranog unosa. Sada bi trebalo da je lako, dovoljno je da upotrebite četvrti upit i tabelu za kreiranje petog upita, povežete ID polja u relaciji 1:1, a zatim promenite tip upita u upit koji briše podatke. Pokretanjem ovog upita, Access prijavljuje da niste definisali tabelu iz koje želite da uklonite podatke. Očigledno, postupak nije dobar. Naredna ideja je da polja tabele u kojima se nalaze duplirani unosi zamenite praznim poljem (Null), a zatim dodatnim upitom izbrišete sve zapise u kojima je polje prazno. Upit sa poslednje slike možete promeniti u Update upit. Zadajte da se podatak IDUnos filtrira prema dodatom upitu, a da se polja se duplikatima menjaju vrednošću Null. Pokretanjem ovog upita, Access prijavljuje grešku Operation must use an updatable query. Ovo takođe nije moguće, jer dok god je bilo koji od upita upit za sumiranje podataka, podaci se ne mogu menjati. U ovom slučaju je to upit koji izdvaja duplikate i filtrira zapise tabele. Ukratko: nakon pet kreiranih upita, duplirani podaci se i dalje nalaze u tabeli, možete ih videti i izdvojiti, ali ih ne možete izbrisati. Opisana procedura demonstrira pogrešan put - brisanje duplikata je, zapravo, mnogo jednostavnije, ali zahteva dobro poznavanje SQL jezika. Za tabelu u primeru upotrebite sledeći upit:
DELETE Q.IDUnos, *
FROM tblPrenosPodataka AS Q
WHERE (((Q.IDUnos)>(SELECT MIN(X.IDUnos)
FROM tblPrenosPodataka X
WHERE Q.txtDupliranPodatak = X.txtDupliranPodatak
AND Q.txtDupliranPodatak2 = X.txtDupliranPodatak2)));
Upit filtrira podatke polja IDUpis tako da se prikazuju (brišu) samo stvarni duplikati upotrebom operatora ">". Filter polja IDUpis je ugnežđeni upit koji takođe grupiše podatke ali, za razliku od prethodnog metoda, nalazi se u polju filtera umesto u relaciji 1:1 sa poljem tabele IDUpis. Upit u filteru pronalazi prvi jedinstven zapis, dok operator ">" uklanja zapise tabele koji odgovaraju ovoj vrednosti. Za pronalaženje duplikata u jednoj koloni, uklonite deo SQL strukture iza operatora AND, jer ovaj upit traži duplikate po dve kolone. Kada tražite duplikate po tri i više kolona, jednostavno dodajte AND i navedite dodatne kriterijume.
|
|
Vrh stranice Prethodna stranica Naslovna strana Mapa sajta Pretraga |
| AFORIZAM ZA DANAS | OVIH DANA SLUŠAMO... |
| Copyright © Praktikum na Webu, 2000-2011; Valinor Design; sva prava pridržana. |