webForumDet fria alternativet

Felstavningar m.m

ASP

4 svar · 231 visningar · startad av Jacob

Medlem sedan dec. 2000503 inlägg
Frågan#1

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.

Medlem sedan dec. 1999707 inlägg
#2

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? :o

Medlem sedan dec. 200012 464 inlägg
#3

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.

Medlem sedan dec. 2000503 inlägg
#4

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)

Medlem sedan dec. 2000503 inlägg
#5

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
264 ms totalt · 4 externa anrop · v20260731065814-full.2f471f9e
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)