Avatar billede tblaster Nybegynder
18. august 2005 - 11:47 Der er 10 kommentarer og
1 løsning

Slette ens poster i databasen

Hejsa

Hvordan skal mit sql script se ud hvis jeg vil undersøge om en tabel indeholder 2 ens poster og hvis den har så skal den slette den ene? Jeg har prøvet med følgende:

DELETE
FROM  `StemmerXIp` S1, `StemmerXIp` S2
WHERE S1.ID = S2.ID and S1.IP = S2.IP and S1.StemmerIp <> S2.StemmerIp

Men den vil jo slette begge af de ens poster og ikke kun den ene som er meningen.
Avatar billede tblaster Nybegynder
18. august 2005 - 11:49 #1
For en god ordens skyld, så er StemmerIp et fortløbende nr og Ip er ip'en på en computer og ID er et nr. på en post!
Avatar billede bromer Nybegynder
18. august 2005 - 11:58 #2
Det kan du ikke umiddelbart gøre sådan. Det er ikke muligt at slette gennem et join. Jeg ville vælge alle duplicates og derefter slette dem.
Avatar billede tblaster Nybegynder
18. august 2005 - 11:58 #3
Og hvordan kan jeg lave det?
Avatar billede barklund Nybegynder
18. august 2005 - 11:58 #4
Jeg ville nok hente alle duplikat-rækker ud først og slette id'erne herefter:

SELECT MAX(StemmerIp) FROM StemmerXIp GROUP BY ID, IP HAVING COUNT(StemmerIP) > 2

Og så slette alle disse id'er. Men det burde jo også klares ved kun at indsætte, hvis det var lovligt :)

--
Morten Barklund
Avatar billede tblaster Nybegynder
18. august 2005 - 12:05 #5
Det giver en:
Din SQL-forespørgsel blev udført korrekt (Forepørgsel tog 0.1835 sek)

Men jeg får ingen poster.

Hvis jeg ´køre min kode med en select får jeg:
Viser poster 0 - 49 (694 total, Forepørgsel tog 0.0013 sek)
Avatar billede bromer Nybegynder
18. august 2005 - 12:09 #6
Det er heller ikke det samme i vælger. Barklunds query tager ens IP'ere, det gør din ikke.
Avatar billede tblaster Nybegynder
18. august 2005 - 12:21 #7
Jeg er ikk ehlt med. Min trækker da poster ud hvor både ip og id er ens. Det er det jeg skal have. Men jeg skal kun have posterne vist en gang, således at jeg kan slette dem!
Avatar billede bromer Nybegynder
18. august 2005 - 12:33 #8
Jeg mener hvor StemmerIP er forskellige.. det var mig der så forkert
Avatar billede kjulius Novice
20. august 2005 - 00:50 #9
Du burde bare kunne køre en SQL som denne:

DELETE *
FROM StemmerXIp AS xip
WHERE exists (select * from StemmerXIp where StemmerId=xip.StemmerId and Id <> xip.Id) and id > (select min(Id) from StemmerXIp where StemmerId=xip.StemmerId);

I den går jeg dog ud fra, at Id er et autonummereringsfelt (primær key), mens StemmerId er forskellig i hver af dubletterne.
Det kunne dog fra spørgsmålet godt se ud som om det er omvendt, og i så fald skal det i stedet være:

DELETE *
FROM StemmerXIp AS xip
WHERE exists (select * from StemmerXIp where Id=xip.Id and StemmerId <> xip.StemmerId) and Stemmerid > (select min(StemmerId) from StemmerXIp where Id=xip.Id);
Avatar billede tblaster Nybegynder
20. august 2005 - 11:30 #10
Yep det hjalp ... hvis lige jeg tilføjede at ip'erne også skulle være ens, altså IP=xip.IP ... smid et svar kjulius!
Avatar billede kjulius Novice
20. august 2005 - 14:00 #11
Much obliged!
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
Computerworld tilbyder specialiserede kurser i database-management

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