Avatar billede duno Nybegynder
19. januar 2008 - 19:21 Der er 23 kommentarer og
1 løsning

kan man slette duplicater i database

Jeg har en database med mere end 300000 indlæg, jeg har netop fundet ud af at jeg har ca 20000 indlæg som er postet 2 eller flere gange ind i databsen, findes der en metode til at rydde op så der kun er et kopi af hver post?

mulighederne er access, sql eller Queryit ( fantastisk program )

har i bedre forslag er jeg med på det
Avatar billede nielle Nybegynder
19. januar 2008 - 19:48 #1
Hvordan ser din tabel ud?
Avatar billede duno Nybegynder
19. januar 2008 - 19:54 #2
gruppe_id, forum_id, topic_id, reply_id, forfatter_id

hvis man søger på topic_id og reply_id så burde det være nok
Avatar billede nielle Nybegynder
19. januar 2008 - 19:55 #3
Har du ikke et id-felt som er forskellig for samtlige poster - også for dubletterne?
Avatar billede duno Nybegynder
19. januar 2008 - 19:58 #4
nope
Avatar billede nielle Nybegynder
19. januar 2008 - 20:01 #5
Det gør det godt nok svært at slette dubletter, hvis der slet ikke er noget som skiler dem overhovdet:

DELETE FROM kommandoen vil jo slette samtlige dubletter hvis den ikke på en eller anden måde ka skelne den enne række fra den anden.

Som minimum bør en hver tabel have et unikt felt.
Avatar billede duno Nybegynder
19. januar 2008 - 20:07 #6
ja, bestemt, denne tabel var en af de første access + asp forsøg jeg lavede, og ideen blev en success.. også imod enhver forventning :o)

det var før jeg viste soget om acces.. og derfor ingen unikke felter, det virkede jo :o)

Men ville man kunne indsætte et tal i alle felter som var ens, altså lave en kolonne mere som havde navnet slet og der indsatte 1 hvergang der var mere end en post med samme "navn/id"
Avatar billede nielle Nybegynder
19. januar 2008 - 20:10 #7
Det ville nok være bedre at udvide tabellen helt generelt med et unikt id til at starte med.
Avatar billede nielle Nybegynder
19. januar 2008 - 20:13 #8
En mulig mulighed:

Omdøb din tabel til noget andet, opret en ny tabel som hedder det samme og har de samme felter + et autonummer felt:

Derefter noget i stil med denne:

SELECT INTO dinTabel (SELECT DISTINCT gruppe_id, forum_id, topic_id, reply_id, forfatter_id FROM originalTabellen)
Avatar billede duno Nybegynder
19. januar 2008 - 20:26 #9
go ide..

Ville man kunne gøre det igennem access ( programmet ) eller kan man også bruge den i forbindelse med MySQL ( er helt ny til SQL ).. eller skal jeg lægge min KÆMPE database op hos min udbyder og lave udtrækket derfra ( er det ikke en kæmpe opgave, og hvad med timeout?? )
Avatar billede nielle Nybegynder
19. januar 2008 - 20:35 #10
Hvorvid man kan gøre det afhænger vist af versionen og om den kan klare sub-selects. Men det er da bare at prøve.

Om opgaven er stor eller ej skal jeg ikke uddtale mig om - umiddelbart lyder 30000 poster som noget der skulle kunen lade sig gøre.
Avatar billede duno Nybegynder
20. januar 2008 - 22:07 #11
det virkede ikke :o(

Microsoft JET Database Engine error '80040e14'

The SELECT statement includes a reserved word or an argument name that is misspelled or missing, or the punctuation is incorrect.

/select.asp, line 9
Avatar billede nielle Nybegynder
20. januar 2008 - 22:21 #12
Hvordan ser din SQL sætning ud?
Avatar billede duno Nybegynder
20. januar 2008 - 23:21 #13
Din omskrevet for at passe til mine rækker

SELECT INTO FORUM_A_REPLY2 (SELECT DISTINCT CAT_ID, FORUM_ID, TOPIC_ID, REPLY_ID, R_STATUS, R_MAIL, R_AUTHOR, R_MESSAGE, R_DATE, R_IP, R_LAST_EDIT, R_LAST_EDITBY, R_SIG FROM FORUM_A_REPLY)

mine

SELECT INSERT INTO FORUM_A_REPLY2 (SELECT DISTINCT CAT_ID, FORUM_ID, TOPIC_ID, REPLY_ID, R_STATUS, R_MAIL, R_AUTHOR, R_MESSAGE, R_DATE, R_IP, R_LAST_EDIT, R_LAST_EDITBY, R_SIG FROM FORUM_A_REPLY)


SELECT DISTINCT CAT_ID, FORUM_ID, TOPIC_ID, REPLY_ID, R_STATUS, R_MAIL, R_AUTHOR, R_MESSAGE, R_DATE, R_IP, R_LAST_EDIT, R_LAST_EDITBY, R_SIG FROM FORUM_A_REPLY INSERT INTO FORUM_A_REPLY2


INSERT INTO FORUM_A_REPLY2 SELECT DISTINCT CAT_ID, FORUM_ID, TOPIC_ID, REPLY_ID, R_STATUS, R_MAIL, R_AUTHOR, R_MESSAGE, R_DATE, R_IP, R_LAST_EDIT, R_LAST_EDITBY, R_SIG FROM FORUM_A_REPLY


SELECT DISTINCT CAT_ID, FORUM_ID, TOPIC_ID, REPLY_ID, R_STATUS, R_MAIL, R_AUTHOR, R_MESSAGE, R_DATE, R_IP, R_LAST_EDIT, R_LAST_EDITBY, R_SIG into #temp_table from FORUM_A_REPLY


og noget helt alternativt

insert into FORUM_A_REPLY2 (CAT_ID, FORUM_ID, TOPIC_ID, REPLY_ID, R_STATUS, R_MAIL, R_AUTHOR, R_MESSAGE, R_DATE, R_IP, R_LAST_EDIT, R_LAST_EDITBY, R_SIG) select distinct * from FORUM_A_REPLY as f where f.topic_id = f.topic_id values (f.CAT_ID, f.FORUM_ID, f.TOPIC_ID, f.REPLY_ID, f.R_STATUS, f.R_MAIL, f.R_AUTHOR, f.R_MESSAGE, f.R_DATE, f.R_IP, f.R_LAST_EDIT, f.R_LAST_EDITBY, f.R_SIG)
Avatar billede nielle Nybegynder
21. januar 2008 - 08:32 #14
SQL sætningen hedder SELECT INTO, og bruges sådan:

http://www.w3schools.com/sql/sql_select_into.asp

Det kunne se ud som om at jeg ikke selv var helt klar på syntaksen i 19/01-2008 20:13:28. Det skal være dette i stedet

SELECT * INTO dinTabel FROM (SELECT DISTINCT gruppe_id, forum_id, topic_id, reply_id, forfatter_id FROM originalTabellen)

Anvendt på din bliver det til:

SELECT * INTO FORUM_A_REPLY2 FROM (SELECT DISTINCT CAT_ID, FORUM_ID, TOPIC_ID, REPLY_ID, R_STATUS, R_MAIL, R_AUTHOR, R_MESSAGE, R_DATE, R_IP, R_LAST_EDIT, R_LAST_EDITBY, R_SIG FROM FORUM_A_REPLY)
Avatar billede duno Nybegynder
21. januar 2008 - 15:43 #15
hmm.. ny fejl

Microsoft JET Database Engine error '80040e14'

Table 'FORUM_A_REPLY3' already exists.

/select.asp, line 9

Jeg har brugt den ovenstående kode
Avatar billede duno Nybegynder
21. januar 2008 - 15:47 #16
har prøvet med en allerede eksisterende tabel ( Table 'FORUM_A_REPLY2' already exists. )

en ikke eksisterende Tabellen findes ikke i databasen ( The field is too small to accept the amount of data you attempted to add. Try inserting or pasting less data. )

og en uden nogen felter ( kolonner ) men en helt tom tabel (Table 'FORUM_A_REPLY3' already exists.
)

() = fejlbesked
Avatar billede nielle Nybegynder
21. januar 2008 - 20:12 #17
Nr. 2 lyder mest lovende.

Jeg kan dog ikke lige se hvorfor at der skulle være en grænse på hvor meget data du må INSERT INTO'e? Er der en opsætning i Access som styre det?
Avatar billede duno Nybegynder
21. januar 2008 - 21:42 #18
Jeg har fundet fejlen, når jeg klipper den fra hinanden kan den klare opgaven med alle andre felter end message. det er en memo, men når jeg kigger på den i min online Table Editor kan jeg se at der står følgende
name : R_MESSAGE
Type : memo
Size : 536870910
Attributes : (updatable) (nullable) (long)

men er grænsen ikke 65000 tegn for et memo, og gælder det også i sql????
Avatar billede duno Nybegynder
21. januar 2008 - 21:47 #19
kan man ændre det??
Avatar billede nielle Nybegynder
22. januar 2008 - 19:12 #20
Så vidt jeg kan læse mig frem til er det kombinatioen DISTINCT + Memo-felt der får det til at fejle.

Prøv at lave den indre SELECT sådan at du ikke medtager memo-feltet i første omgang. Hvis det lykkes burde det være muligt at få fat på memo-værdierne i en SQL nummer 2 bagefter.
Avatar billede duno Nybegynder
23. januar 2008 - 16:58 #21
Der er fundet en bedre løsning, det kan gøres direkte via access, der er faktisk en "søg duplicater guide" funktion under "forspørgelser" hvis man køre den guide så er opgaven løst på under 2 min, det tog så ca 10 min at kopiere resultatet ud i en ny tabel, men nu er problemet løst 100 %

Jeg er gået fra 297.000 til 244.000 poster og alle er unikke!! SUPER!

Du skal stadig have points, for din løsning var jo korrekt, der var bare en uforudset fejl i databasen...

Send mig et svar så sender jeg points og et stort tak for hjælpen den modsatte vej!!
Avatar billede nielle Nybegynder
23. januar 2008 - 18:20 #22
Cool. :^)

Nu er næste problem så at finde ud af hvordan dubletterne er pstået og forhindre at de kommer i fremtiden.
Avatar billede duno Nybegynder
24. januar 2008 - 13:08 #23
Niks.. det er der helt styr på :o( <--- Ved ikke hvordan man laver en rødmende smiley

For skylden ligger 110 % på mine skuldre, grunden til at de er kommet er fordi at jeg har lavet fejl i forbindelse backup af poster, jeg er kommet til at kopiere de samme ind flere gange inden for det sidste år, fejlen opstår ikke igen, nu har alle felter fået unikt id ( jeps man lære jo noget nyt hverdag )
Avatar billede nielle Nybegynder
24. januar 2008 - 13:10 #24
Så er dagen jo heldigvis ikke spildt :^)
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