Avatar billede 3dmaxer.dk Nybegynder
23. februar 2002 - 21:02 Der er 13 kommentarer og
1 løsning

Slet dem uden @ i db - og dobbelt posts

Er der en der gider hjælpe med en kode, som gør følgende når den bliver kørt:

Access db: ma
tabel: ils
kolonner: ID, ADR

Jeg ønsker at slette de rækker, som her den samme værdi i ADR - dvs. hvis der er dobbeltværdi i ADR, så skal den ene slettes, så der kun er én tilbage med denne værdi.

Endvidere skal alle de rækker hvor @ ikke indgår i værdien i ADR slettes.

giver lige et eksempel så:

I tabel ILS er der 2 kolonner:

ID,ADR

Der er 5 rækker med følgende data:

1,er@er.dk
2,timoer
3,skr@sdfg.com
4,ter@sd.dk
5,skr@sdfg.com

række nr. 2 skal slettes da @ ikke indgår i ADR
række nr. 5 skal slettes da ADR er lig med række 3

Nogen der kan hjælpe ?
Avatar billede mugs Novice
23. februar 2002 - 22:06 #1
Du sletter poster uden @ ved en sletteforespørgsel med flg SQL-sætning:

DELETE ils.ID, ils.ADR
FROM ils
WHERE (((ils.ADR) Not Like "*@*"));

Du kan evt. køre forespørgslen fra en formular med kommandoen DoCmd.OpenQuery "Forespørgselsnavn"

DELETE ils.ID, ils.ADR
FROM ils
WHERE (((ils.ADR) Not Like "*@*"));
 
Den anden med dubletter er lidt mere kringlet. Jeg arbejder lidt videre.
Avatar billede proaccess Nybegynder
24. februar 2002 - 08:01 #2
Du kan klare begge dele i ét hug ved at køre denne:

DELETE ils.ID, ils.adr FROM ils WHERE (ils.adr Not Like '*@*') OR (ils.ID Not In (SELECT Min(ID) FROM ils GROUP BY adr));
Avatar billede mugs Novice
24. februar 2002 - 09:06 #3
Nu har jeg brokket med det den halve nat og hele morgenen!! Jeg vidste der var en smart løsning. :o)
Nå -shit, så lærte jeg da også noget.
Avatar billede proaccess Nybegynder
24. februar 2002 - 09:31 #4
Man kan også oprette en midlertidig tabel med de gyldige ID og adresser, og derefter tømme ils, og flytte de gyldige adresser "hjem" igen...

  SELECT Min(ID) AS MinID, adr INTO ilsTEMP FROM ils GROUP BY adr HAVING adr LIKE '*@*'
  DELETE * FROM ils
  INSERT INTO ils (ID, adr) SELECT MinID, adr FROM ilsTEMP
  DROP TABLE ilsTEMP

Dette er KLART hurtigere, hvis der er tale om mange records (jeg lavede en test med 160000+ records!)
Avatar billede proaccess Nybegynder
24. februar 2002 - 09:33 #5
BEMÆRK: Ved at bruge "INSERT INTO..." kan man sagtens overskrive Autonummer-felter (som jeg går ud fra ID er), så der bliver ikke noget problem med nye ID'er til eksisterende records, og nye records vil fortsætte i rækkefølgen.
Avatar billede 3dmaxer.dk Nybegynder
24. februar 2002 - 12:58 #6
Det ser ud til at jeg har lidt problemer.

Fx er der et eller andet fejl ved med denne:

SELECT Min(ID) AS MinID, adr INTO ilsTEMP FROM ils GROUP BY adr HAVING adr LIKE '*@*'

Jeg lavede en test hvor jeg kun kørte denne statement, men det ville den slet ikke??? Hvad gør jeg galt


Endvidere har jeg prøvet at denne linie for at teste den:
DELETE ils.ID, ils.adr FROM ils WHERE (ils.adr Not Like '*@*')

og her sletter den alle rækker - også dem med @, hvilket den jo ikke skal?
Avatar billede proaccess Nybegynder
24. februar 2002 - 13:05 #7
Hvad skete der da du kørte den 1. SQL, fik du ikke oprettet en ny tabel ved navn "ilsTEMP" ?? - Hvad kom der evt. af fejlmeddelser?
Avatar billede 3dmaxer.dk Nybegynder
24. februar 2002 - 14:08 #8
sql = "(SELECT Min(ID) AS MinID, navn INTO sletTEMP FROM slet GROUP BY navn HAVING navn LIKE '*@*') "
myConn.execute(sql)

Den opretter en tabel, men den flytter intet over i den
Avatar billede proaccess Nybegynder
24. februar 2002 - 14:20 #9
Så har du åbenbart et problem med LIKE... Hvor udfører du SQL'en fra?

og kan du evt. forsøge med:
SELECT Min(ID) AS MinID, adr INTO ilsTEMP FROM ils GROUP BY adr WHERE INSTR(adr, '@')>0
Avatar billede 3dmaxer.dk Nybegynder
24. februar 2002 - 15:16 #10
Jeg kører den fra asp på web. Jeg benytter LIKE ved andre sammenhænge, hvor det virker. Så jeg tror det er '*@*' den ikke forstår rigtigt - den opfatter den som noget andet.

Jeg har prøvet det andet, men den siger at siden vil ikke vises. Dette er hvad jeg kører:

<%
Set myConn = Server.CreateObject("ADODB.Connection")
myconn.open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & Server.MapPath("****.mdb")
sql = "SELECT Min(ID) AS MinID, navn INTO sletTEMP FROM slet GROUP BY navn WHERE INSTR(navn,'@')>0"
myConn.execute(sql)
myconn.Close
Set myConn = Nothing
%>

slet=ils
navn=adr

Hvad gør jeg galt?
Avatar billede proaccess Nybegynder
25. februar 2002 - 08:20 #11
du skal være sikker på at bruge de rigtige feltnavne, hedder dit 2. felt adr eller navn?

Jeg kender ikke svaret på hvorfor der er problemer med @ fra ASP, det lyder ikke logisk for mig...
Avatar billede proaccess Nybegynder
13. marts 2002 - 07:43 #12
Fandt du ud af dit problem, og kan vi få lukket spørgsmålet...?
Avatar billede 3dmaxer.dk Nybegynder
19. marts 2002 - 18:28 #13
Jeg har simpelthen ikke set på problemet siden - det undskylder jeg. Jeg har i dag siddet leget lidt med det igen. Det viser sig at det er stjerne * den tolker forkert. Den ser ikke stjernerne som vilkårlige tegn. Hvis jeg skriver et præcist navn, så ser det ud til at virke.

Vender tilbage snarest
Avatar billede 3dmaxer.dk Nybegynder
21. marts 2002 - 20:50 #14
Det virker perfekt nu - der skal bare bruges % som wildcard i stedet for *

tak for hjælpen
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