Avatar billede jmc Nybegynder
04. oktober 2004 - 09:27 Der er 14 kommentarer og
1 løsning

SQL dubletter delete

Er der en måde hvorpå (man enkelt) kan slette alle dubletter i en tabel i access via sql?
gerne hele koden her, jeg har set en del sider med eksempler hvor man skal over mange genveje.
Avatar billede fennec Nybegynder
04. oktober 2004 - 10:24 #1
Denne burde gøre det, men lav en kopi for en sikkerheds skyld. Du skal bare tilføje kravene til listen, det kunne jo være at nogle af felterne er forskellige.


Delete FROM DinTabel
WHERE (ID IN
  (SELECT t1.id
  FROM DinTabel t1, DinTabel t2
  WHERE t1.name = t2.name AND t1.address = t2.address AND t1.id <> t2.id)
)
Avatar billede eagleeye Praktikant
04. oktober 2004 - 11:13 #2
Hvis der er 2 ens poster, skal den beholde en post eller skal begge slettes helt?
Avatar billede jmc Nybegynder
04. oktober 2004 - 23:41 #3
den ene skal beholdes!
Avatar billede fennec Nybegynder
05. oktober 2004 - 08:10 #4
Det burde min gøre....
Avatar billede jmc Nybegynder
05. oktober 2004 - 10:52 #5
fennec du arbejder jo med to tabeller, jeg har kun en!
Avatar billede eagleeye Praktikant
05. oktober 2004 - 10:59 #6
Den vil slette dem alle, husk på den udføre wheren for hver post. Hvis tre poster er ens ved ID=1, ID=2 og ID=3 når t1.id=1 vil den side 2,3 skal slettes og ved t1.id=2 vil den sige 1,3 skal slettes. Så dermed er alle slettet.

Det er faktisk ikke nogen let sag se her hvordan SQL kan se ud men en SQL sætning:
http://www.4guysfromrolla.com/webtech/sqlguru/q051200-2.shtml


Har du unike ID kan du hente alle duplicates ud.
Select navn, coutn(navn) as anatl from tabel group by navn having count(navn)>1

hvis det kommer ind i et recodset kan du løbe det igenenm og hente ID på første kolonne hvir navn findes:

set rsid=Conn.execute ("select top 1 id from tabel where navn='" &rs("navn")&"'")

Så kan kan slette alle hvor rs("navn") findes men id er forskellig fra rsid("id")

Conn.execute("delete from tabel where navn='"&rs("navn") &"' and id <> " & rsid("id"))

Sådan ser koden ud den gør i samme som den SQL sætning:

do while not rs.EOF
  set rsid=Conn.execute ("select top 1 id from tabel where navn='" &rs("navn")&"'")
  Conn.execute("delete from tabel where navn='"&rs("navn") &"' and id <> " & rsid("id"))
  rs.movenext
loop
Avatar billede fennec Nybegynder
05. oktober 2004 - 11:07 #7
eagleeye >>
Sletter den ikke posterne 2 og 3 først inden den går til næste post (4. Da de andre er slettet)??? Det troede jeg da den gjorde.
Avatar billede eagleeye Praktikant
05. oktober 2004 - 11:18 #8
den udføre først dette:
SELECT t1.id
  FROM DinTabel t1, DinTabel t2
  WHERE t1.name = t2.name AND t1.address = t2.address AND t1.id <> t2.id)
)

og dermed komme alle ID's med i "listen" som skal slettes med WHERE ID in(..)
Avatar billede fennec Nybegynder
05. oktober 2004 - 11:22 #9
Det var da rart at finde ud af :o)

Så må denne vel virke. Der sletter den ikke den med det mindste ID (som beskrevet i dit link).

Delete FROM DinTabel
WHERE
ID IN
  (SELECT t1.id
  FROM DinTabel t1, DinTabel t2
  WHERE t1.name = t2.name AND t1.address = t2.address AND t1.id <> t2.id)
and ID not in (
  SELECT min(t1.id)
  FROM DinTabel t1, DinTabel t2
  WHERE t1.name = t2.name AND t1.address = t2.address)
Avatar billede jmc Nybegynder
05. april 2005 - 19:53 #10
points?
Avatar billede fennec Nybegynder
06. april 2005 - 08:49 #11
Det må være eagleeye der skal have dem
.o) <-- One Eyed Jack
Avatar billede jmc Nybegynder
06. april 2005 - 09:51 #12
kom så eagleeye, lad mig lukke. Jeg for på hatten for at have spørgsmål åbne.
Avatar billede jmc Nybegynder
20. oktober 2005 - 09:49 #13
takker
Hvis du vil svare så kan jeg acceptere ;o)
Avatar billede eagleeye Praktikant
14. december 2005 - 00:01 #14
Ok her et meget forsinket svar, håber det går :)
Avatar billede jmc Nybegynder
17. januar 2006 - 10:13 #15
takker
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
Kurser inden for grundlæggende programmering

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