JJacobMedlem sedan dec. 2000503 inlägg 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
Men den hittar inte så många fel som det är.
tohaMedlem sedan dec. 1999707 inläggJa, 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? :o
LLarsGMedlem sedan dec. 200012 464 inlägg Du kan nog få ihop det med en fråga
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.
JJacobMedlem sedan dec. 2000503 inlägg 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)
JJacobMedlem sedan dec. 2000503 inlägg Så här ska det vara:
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