Jag har en databas med en massa skådespelare (ca. 5000) Bland dessa har de kommit in några felstavningar. Jag orkar inte gå igenom alla 5000 så jag tänte göra ett script som letar reda på liknande poster, Jag gjorde så här:
set te=conn.execute("select * FRoM actor")
Do until te.eof
fnamn=te("fnamn")
enamn=te("enamn")
te.MoveNext
Do until te.eof
sql2 = "SELECT DIFFERENCE('"&fnamn&"', '"& te("fnamn")&"')"
Set svar= Conn.Execute(sql2)
If svar("")=4 then
sql3 = "SELECT DIFFERENCE('"&enamn&"', '"&te("enamn")&"')"
Set svar= Conn.Execute(sql3)
If svar("")=4 then Response.Write(fnamn&" "&enamn&" = "&te("fnamn")&" "&te("enamn")&"<br>")
End If
te.MoveNext
Loop
n=n+1
te.MoveFirst
te.move n
Loop
Problemet är att det tar en evighet att köra scriptet, så jag undrar om det är något fel, eller om man kan optimera det. Jag testade:
set te=conn.execute("select * FRoM actor")
Do Until te.eof
set tes=conn.execute("select * from actor where soundex(fnamn) = soundex('"&te("fnamn")&"') AND soundex(enamn) = soundex('"&te("enamn")&"')")
Do Until tes.eof
If NOT te("fnamn")=tes("fnamn") AND NOT tes("enamn")=te("enamn") Then
Response.Write(te("fnamn")&" "&te("enamn")&" = "&tes("fnamn")&" "&tes("enamn")&"<br>")
End If
tes.MoveNext
Loop
te.MoveNext
Loop
Ja, kan förstå att det tar lång tid. Många databasanrop blir'e.
Ett sätt att snabba upp det är att göra en stored procedure av det hela. Ett annat sätt är att försöka skriva frågan i så få databasfrågor som möjligt. Jag är ingen sql-expert men jag tror det ska gå att göra på nå't vänster.
Bra grej det där med SOUNDEX() och DIFFERECE(). Visste inte att det fanns.
En fråga bara: betyder inte soundex-värdet 4 att strängarna matchar exakt?
query = "select a1.fname,a1.ename,a2.fname,a2.ename " &_
" from actor a1 , actor a2 where a1.actorid <> a2.actorid" & _
" and difference(a1.fname+a1.ename,a2.fname+a2.ename) = 4"
Jag antar att du har någon kolumn (actorid) i tabellen som är unik
Den blir nog ganska tung att utföra då du måste jämföra alla med alla.
Det verkar som om du är något på spåren Lars men den tar bara på förnamnet verkar det som. Jag får iaf ett para tusen svar.
Och när jag kör den i enterprise så gör den om den till:
SELECT a1.fnamn, a1.enamn, a2.fnamn AS Expr1, a2.enamn AS Expr2
FROM actor a1 INNER JOIN
actor a2 ON a1.actorid <> a2.actorid
WHERE (DIFFERENCE(a1.fnamn + a1.enamn, a2.fnamn + a2.enamn) = 4)
SELECT a1.actorid, a1.fnamn, a1.enamn, a2.actorid AS Expr3, a2.fnamn AS Expr1, a2.enamn AS Expr2
FROM actor a1 INNER JOIN
actor a2 ON a1.actorid <> a2.actorid
WHERE (DIFFERENCE(a1.fnamn, a2.fnamn) = 4) AND (DIFFERENCE(a1.enamn, a2.enamn) = 4
390 ms totalt · 4 externa anrop · v20260731065814-full.d34c6d5a