Avatar billede jss Nybegynder
21. september 2005 - 09:22 Der er 16 kommentarer og
1 løsning

Avanceret SQL: Slet dubletter (undtagen senest oprettede)

Hej eksperter

Via http://eksperten.dk/spm/546537 (og linket http://www.4guysfromrolla.com/webtech/sqlguru/q051200-2.shtml) er jeg kommet frem til en smart SQL der kan slette dubletter.

Mit problem er at jeg har brug for at bevare den SENEST oprettede post og ikke den FØRST oprettede post blandt dubletterne.
Jvf. 4guysfromrolla eksemplet (UNIQUE KEY) er det i liste 2: SELECT Min(ID) jeg gerne vil lave om til SELECT Max(ID), men det giver ikke det samme antal slettede poster. Der slettes for mange poster ved brug af Max, dvs. den sletter poster der skulle forblive tilbage (hvis der feks. er 4 ens poster, da sletter den alle 4 og ikke kun de 3 FØRST oprettede poster som planlagt).

Hvad skal der til .. kan det lade sig gøre?
Avatar billede busschou Praktikant
21. september 2005 - 11:37 #1
Et afsindigt skud i tågen :o)
Prøv at tilføje en "Order By ID Desc" nederst i liste2 lige inden "Group By Field1, Field2"
Avatar billede jss Nybegynder
21. september 2005 - 12:35 #2
hm - det giver mig en fejl. Måske jeg præver at lave et array/dictionary til at løse det ...
Tak for forslag
Avatar billede busschou Praktikant
21. september 2005 - 12:42 #3
jeg har ikke 110% tjek på den store sql sætning der
MEn du kan vel altid lave det slavisk i et par løkker, omend det selvfølgelig ikke er så pænt måske
Først kan du vælge alle unikt ud så du får den nyeste unikke forekomst, det må kunne gøres ved en group by på de to felter (eller flere) som skal definere hvorvidt rækkerne er ens, samt en order by
---
sql1 = "Select * From tabel Order By Id Desc Group By felt1, felt2"
set rs1 = conn.execute(sql1)
---
rs1 må så indeholde det du ønsker skal stå tilbage efter du har slettet dubletter
Ved at løbe rs1 igennem kan man vel så bare slette dubletterne løbende ved at slette de poster som har felt1 og felt2 tilfælles men hvor id er mindre
---
do while not rs1.eof
  conn.execute("delete from tabel where felt1 = rs1("felt1") and felt2 = rs1("felt2") and id < rs1("id")
rs1.movenext
loop
Avatar billede jss Nybegynder
21. september 2005 - 12:51 #4
OK - kan se din pointe. Nu nærmer vi os eagleeye´s løsning i http://eksperten.dk/spm/546537, som jo også  er mere overskuelig, omend der bliver en del kald til db (Jeg kan sagtens have flere tusinde dubletter der skal slettes).
Det jeg tænkte på var, om man i den løkke du foreslår, opbygger et arrar el. lign, som man derefter putter ind i en SQL-sætning ala DELETE FROM tbl WHERE ID IN (array). Dette giver jo kun et enkelt kald, så vidt jeg har forstået IN-funktion i SQL.
Avatar billede busschou Praktikant
21. september 2005 - 12:54 #5
Jamen altså en simpel anden metode kunne jo være at hive de rækker ud som du ønsker at beholde, og dernæst så lave en "Delte From Tabel" så får du slettet hele tabellen. Dernæst kan du så udfra de rækker du har hivet ud enten oprette en ny tabel, eller løbe dem igennem og indsætte dem på ny
Avatar billede busschou Praktikant
21. september 2005 - 12:57 #6
hov så ikke det du skrev, i givet fald skulle det så være "Where id Not In" ;o) for ellers får du slettet dem du ønsker at beholde ;o)
Men du kan ikke benytte et asp array, det skal være en komma sepereret liste, altså fx
"Where Id Not In (1,2,3,4,5)"
Dvs du i asp skal løbe dit recordset igennem og lave en streng
--
do while not rs1.eof
  arr = rs1("id") & "," & arr
loop
--
og så
"where id not in (" & left(arr,length(arr)-1) &")"
Avatar billede jss Nybegynder
21. september 2005 - 13:01 #7
Det er jo også en mulighed - det giver nok en hel arbejde for db, da det ikke er usædvanligt for mig at have 50.000+ poster i en tabel !! Men helt sikkert også en mulighed, som jeg kan prøve.
Jeg når nok ikke at arbejde meget videre med dette de næste par dage, men så vender jeg helt sikkert tilbage :) Tak for hjælpen hertil.
Avatar billede busschou Praktikant
21. september 2005 - 13:04 #8
ja med så mange poster er det ikke synderligt smart at lave et opslag for hver indgang
Den bedste løsning er at løse det som 4guys der, men den kan jeg ikke helt lure
Den næstbedste må så være at lave en kommasepereret liste, asp vil relativt hurtigt loope igennem 50000+ elementer, dræberen ville være hvis du skulle ind i databasen hver gang

Pøj pøj med det
Avatar billede jss Nybegynder
21. september 2005 - 13:08 #9
Nå, der krydsede vores indlæg lige.
Ja, jeg skal da vist lige være obs på om det er Not In
    eller In
      :-)
Avatar billede busschou Praktikant
21. september 2005 - 13:30 #10
Nu prøvede jeg altså lige lave en tabel med 20 blandede rækker
og hvis jeg retter Min til Max så virker det fint!
Så måske du har kommet til at rette en anden dum lille ting?
Avatar billede jss Nybegynder
21. september 2005 - 13:35 #11
Det lyder interessant!! Det må jeg vist hellere lige kigge nærmere på (endnu en gang til ...)
Avatar billede jss Nybegynder
28. september 2005 - 20:24 #12
busschou -> jeg har ikke glemt dig, dog har jeg ikke lige haft tid endnu (!) til at kigge nærmere på dine forslag...
Avatar billede busschou Praktikant
28. september 2005 - 21:33 #13
det er oki doki, du skriver bare når det er :o)
Avatar billede jss Nybegynder
02. december 2005 - 10:39 #14
busschou: dette spørgsmål skal lukkes nu. Jeg har i stedet brugt din løsning fra
http://eksperten.dk/spm/642617, men synes stadig du skal have lidt point for indsatsen. Så læg et svar ved lejlighed :-)
Avatar billede jss Nybegynder
05. januar 2006 - 09:54 #15
Lukker
Avatar billede busschou Praktikant
18. januar 2006 - 23:43 #16
min mail har desværre ikke virket herinde... nu virker den igen...heldigvis :o)
Desværre er der så mange spørgsmål som er blevet lukket i mellemtiden....desværre :o(
Avatar billede jss Nybegynder
19. januar 2006 - 08:49 #17
fortvivl ikke - jeg vil gerne oprette et nyt spørgsmål, så du kan få lidt for indsatsen :-)

http://www.eksperten.dk/spm/680830
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