|
Microsoft Office Access |
|
|
Duplirani zapisiNivo:
Referencijalni integritet bi trebalo da obezbedi korisnika od dupliranja podataka. Ipak, u praksi se dešava da se razni zapisi ponavljaju jednom ili više puta. Na primer, kada omogućite korisniku transfer podataka iz drugih baza podataka, pri čemu niste definisali jedinstveni ključ ili u slučaju kada se jedinstveni ključ može načiniti od dva ili više polja zapisa. Takve podatke možete sačuvati u tabeli sa privremenim sadržajem, ukloniti duplikate - posebno u slučaju kada je korisnik više puta učitao podatke iz iste datoteke - a zatim distribuirati podatke u tabele sa trajnim sadržajem. Pronaći duplirane zapise je zapravo lako: postojeći čarobnjak pod nazivom Find Duplicates Query Wizard će na osnovu vaših odgovora na postavljena pitanja kreirati upit u kome možete videti koji su zapisi duplirani i koliki je njihov broj. Primer ovakvog upita možete videti na slici. Upit prebrojava ponavljanje istih zapisa i prikazuje rezultate gde je ovaj broj veći od 2 (za broj 1 zapis je jedinstven), grupišući pritom neko od ID polja na jedinstvenu vrednost.
Dobro, pronašli ste zapise koji se dupliraju i videli broj ponavljanja. I šta dalje? Verovatno ste poželeli da na osnovu prethodnog napravite nekakav upit koji bi pobrisao duplirane zapise. Ovde obično nastaju problemi, jer se od ovog momenta zahteva dobro poznavanje SQL jezika. Za početak, zaboravite upit koji je čarobnjak kreirao, nego krenite sa novim upitom. Pređite u SQL prikaz i prenesite sledeću SQL strukturu: SELECT tblTabela.fldPolje, tblTabela.ID FROM tblTabela WHERE (((tblTabela.fldPolje) In (SELECT [fldPolje] FROM [tblTabela] AS Tmp GROUP BY [fldPolje] HAVING Count(*)>1))) ORDER BY tblTabela.fldPolje; Primetite dvostruku SELECT klauzulu: o ugnežđenim upitima smo pisali detaljnije u prethodnim prilozima. Sačuvajte ovaj upit pod nekim nazivom, npr. qryOD1, a zatim kreirajte novi upit i pređite u SQL prikaz. Prilagodite sledeću SQL strukturu vašoj tabeli i prethodnom upitu, pa je prenesite u novi upit: SELECT DISTINCTROW Q1.ID, Max(Q2.ID) AS MaxOfID FROM qryOD1 AS Q1 INNER JOIN qryOD1 AS Q2 ON Q1.fldPolje = Q2.fldPolje GROUP BY Q1.ID HAVING (((Max(Q2.ID))>[Q1]![ID])); Ovaj upit morate napisati u SQL prikazu; tek nakon što završite pisanje, možete ga pogledati u režimu prikaza dizajna. Primer takvog upita vidite na sledećoj slici. Sačuvajte ga pod nekim nazivom, npr "qryOD2" jer ćete ga iskoristiti za treći i konačni upit.
Treći upit je jednostavan: povežite vašu tabelu sa drugim upitom (qryOD2) u relaciji jedan-ka-jedan, promenite tip upita na Delete Query i prenesite polje "*" u upit; zvezdica označava sva polja tabele, ali možete koristiti i bilo koje drugo, jer ćete zapise brisati bez filtriranja. Prenesite u SQL prikaz upita sledeću SQL strukturu: DELETE DISTINCTROW tblTabela.* FROM tblTabela INNER JOIN qryOD2 ON tblTabela.ID = qryOD2.ID; Stvari se "malčice" komplikuju kada tražite jedinstvene zapise po više zapisa. Pretpostavimo da želite da ustanovite jedinstvene zapise uključujući pet polja zapisa. Tada će upiti imati sledeću SQL strukturu (nazivi polja su skraćeni zbog preloma):
SELECT
T1.F1, T1.F2, T1.F3,
T1.F4, T1.F5, T1.tblTabela_ID
FROM tblTabela AS T1
WHERE (((T1.F1) In
(SELECT [F1]
FROM [tblTabela] As Tmp
GROUP BY [F1],[F2],[F3],[F4],[F5]
HAVING Count(*)>1 And [F2] = [T1].[F2]
And [F3] = [T1].[F3] And [F4] = [T1].[F4]
And [F5] = [T1].[F5])))
ORDER BY T1.F1, T1.F2, T1.F3, T1.F4, T1.F5;
SELECT DISTINCTROW Q1.tblTabela_ID
FROM qryOD1 AS Q1
INNER JOIN qryOD1 AS Q2
ON (Q1.F5 = Q2.F5)
AND (Q1.F4 = Q2.F4)
AND (Q1.F3 = Q2.F3)
AND (Q1.F2 = Q2.F2)
AND (Q1.F1 = Q2.F1)
GROUP BY Q1.Table1_ID
HAVING (((Max(Q2.tblTabela_ID))>[Q1]![tblTabela_ID]));
Postoje slučajevi kada će upit koji briše podatke prijaviti grešku; u ovom slučaju, to je treći upit. Prvo proverite da li je tabela obeležana sa oznakom "samo za čitanje" (Read Only), zatim proverite vaša prava u radu sa objektima baze. Ukoliko ovo ne pomogne, proverite da li je tabela povezana sa tabelom koja je obeležena oznakom "samo za čitanje". Pokušajte da napravite kopiju tabele, pa nad njom pokrenite upit za brisanje. U svakom slučaju, mogućnost brisanja zapisa možete jednostavno proveriti: otvorite tabelu u režimu uređivanja podataka, obeležite zapis i pokušajte da ga izbrišete pritiskom na taster DEL. Ako u tome ne uspete, uzrok tome je isti onaj koji je sprečio izvršavanje upita. "Luksuznije" rešenje ovog problema zahteva rad sa sirovim podacima i znatno uvećan utrošak resursa i prostora. Jednostavno, kreirajte upit prema vašoj tabeli i postavite sva polja u upit. Uključite prikaz grupisanja i ostavite vrednosti Total kolone na Group By. Pokrenite upit i iskopirajte sve podatke u tabelu sa privremenim sadržajem. Zatim izbrišite podatke iz prvobitne tabele - pod uslovom da neko od polja tabele nije u referencijalnim integritetu sa poljem druge tabele - i iskopirajte podatke iz prvobitne tabele. Naravno, obavezno načinite kopiju baze podataka pre nego što pokrenete akcioni upit.
|
|
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. |