Avatar billede maasen Nybegynder
21. december 2007 - 08:08 Der er 7 kommentarer og
1 løsning

Dubletter slettes, men én skal forblive i tabellen

Hej med Jer

Jeg har søgt en del svar igennem omkring sletning af dubletter, men kan ikke finde det svar jeg søger, så jeg prøver selv med et spørgsmål:-)

Jeg har en tabel der 'logger' nogle data. Men denne log kan komme til at indeholde dubletter, altså hele rækker der er ens, bortset fra id´et.

Jeg ønsker at lave en funktion der automatisk sletter alle dubletter i tabellen, med undtagelse af en enkelt, hver gang jeg forlader en bestemt formular.

Hvordan skæres den kage?

På forhånd tak
MVH Maasen
Avatar billede petersen7913 Forsker
21. december 2007 - 08:55 #1
Hvis det kun er ID, der adskiller dine data, så kan du jo f.eks. slette alle undtagen min(ID) eller max(ID). Ellers vil man typisk slette alt undtagen rowid = 1 (Oracle)
Avatar billede maasen Nybegynder
21. december 2007 - 09:07 #2
Ja, men hvordan? - lidt vejledning vil hjælpe her... har ikke lavet forspørgsler/sletteforespørgsler osv. før
Avatar billede petersen7913 Forsker
21. december 2007 - 09:22 #3
Så din log-tabel ser ud sådan:

ID  felt1  felt2 felt3 ....
1  ABC    123  xyz
2  ABC    123  xyz
3  ABC    123  xyz
....

delete from <tabel> where ID > select min(ID) from <tabel>
Avatar billede maasen Nybegynder
21. december 2007 - 09:30 #4
Min log tabel ser sådan ud:

ID  f1  f2 ...
1  abc  123 ...
2  abc  123 ... <slet>
3  def  456 ...
4  def  456 ... <slet>
5  ghi  123 ...
6  ghi  123 ... <slet>
7  ghi  456 ...
8  ghi  456 ... <slet>
9  ghi  456 ... <slet>

Hvad siger du til det??

MVH Maasen
Avatar billede maasen Nybegynder
21. december 2007 - 09:34 #5
Hvor skal jeg skrive det henne,,,delete from <tabel> where ID > select min(ID) from <tabel>... og løser det mit problem??
Avatar billede petersen7913 Forsker
21. december 2007 - 11:59 #6
Jeg har delt det op i 3 dele, så det er mere overskueligt hvad der sker:

Tabel id, felt1, felt2

find alle dubletter:
SELECT Count(t.felt1) AS AntalOffelt1, t.felt1, t.felt2
FROM t
GROUP BY t.felt1, t.felt2
HAVING (((Count(t.felt1))>1));

find min(ID) for dubletterne:
SELECT Min(t.Id) AS MinOfId, t.felt1, t.felt2
FROM t
GROUP BY t.felt1, t.felt2
ORDER BY Min(t.Id);


find alle ID, som er større end min(ID) for dubletterne
SELECT t.Id, t.felt1, t.felt2
FROM t
where t.Id not in (SELECT Min(t.Id) AS MinOfId
FROM t
GROUP BY t.felt1, t.felt2)

Så kan du selv skrive det sammen i en select, og så lave den om til

delete from tabel where ID in (select .... og alt det ovenfor)
Avatar billede Slettet bruger
21. december 2007 - 12:32 #7
Lav et indeks i din tabel!~)

Åben tabel i designvisning
Gå i vis/indeks
Skriv et indeks navn og det første felt, som skal indgå.
Gør indeks'et unikt ved at vælge ja i egenskaben uniktindeks
Herefter skriver du de resterende felter uden at skrive et indeks navn, det betyder at de alle falder ind under det samme indeks...
Avatar billede maasen Nybegynder
03. januar 2008 - 08:18 #8
Er ked af at have brugt jeres tid, jeg kan simpelthen ikke finde hoved og hale i ovenstående forklaringer...

Jeg giver op...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester