webForumDet fria alternativet

Matcha poster med LIKE

Databaser & SQLur Databashanterare & SQL

10 svar · 541 visningar · startad av Troxy

TroxyMedlem sedan mars 20041 505 inlägg
#1

Hejsan.
Jag har två tabeller som jag vill försöka länka ihop.

Tabell1 innehåller olika filmartiklar, med bland annat titel, artikelnummer, pris osv.
Tabell2 innehåller information om filmer, som exempelvis titel, skådespelare, speltid osv.

Just nu så finns det ingen relation mellan tabell1 och 2, eftersom tabell2 är alldeles ny.

Så nu vill jag med en SQL-fråga försöka länka ihop tabellerna så gott det går.
Detta vill jag göra genom att jämföra fältet Tabell1.Titel med Tabell2.Titel i en LIKE-sats.

Om det blir en träff, så ska Tabell2.ID sparas i Tabell1.FilmID så att det byggs upp en relation mellan tabellerna.
Det kommer antagligen inte att bli träffar för alla poster, men det spelar ingen roll.

Tacksam för hjälp!

headbugMedlem sedan sep. 2006867 inlägg
#2

Jag ser ett problem och det är att du vill skapa en nyckel ur en fråga med LIKE, dvs du kan få ingen träff, en träff eller flera träffar. Jag tror att MSSQL i alla fall förbjuder en UPDATE med en subselect som inte ger ett enda unikt svar. Så spontant tror jag inte det går, men det kanske finns någon som är klurigare än jag(?) Är det 1000 och åter 1000 poster förstår jag att du inte vill göra det för hand...

TroxyMedlem sedan mars 20041 505 inlägg
#3

Det är just MSSQL det handlar om (jag glömde skriva det).
Och ja, ibland så får man ju inte ett svar eftersom det handlar om LIKE.
Det finns mellan 20000-40000 poster i tabellerna.

Som det är just nu så har en kille byggt ett fult litet VB-program som hämtar alla poster i tabell1 och loopar igenom post för post. För varje varv så görs en LIKE-fråga mot tabell2 och om det blir träff så uppdateras posten i tabell1.

Visst, det fungerar, men det tar ett tag, ibland upp emot 20 minuter att köra programmet och under den tiden så låser nästan SQL-servern datorn.
Jag känner att man borde kunna lösa detta lite snyggare med hjälp av en rejäl SQL-fråga som gör jobbet mycket snabbare.

emissionMedlem sedan dec. 19996 721 inlägg
#4
UPDATE t1
SET t1.FilmID=t2.ID
FROM Tabell1
INNER JOIN Tabell2 t2 ON t1.Titel LIKE t2.Titel + '%' -- Eller hur du nu ville matcha
WHERE t1.FilmID IS NULL -- För du ville väl inte uppdatera sådana som redan fått sitt ID?
TroxyMedlem sedan mars 20041 505 inlägg
#5

emission, tack, det där ser lovande ut, med tanke på att du klarade dig utan en subquery :)
Jag ska försöka testköra den där frågan i morgon!

En sak jag undrar dock: Är t1 och t2 alias? Eller tabellnamn?
Om det är alias, var i frågan talar du om vilken tabell t1 är?

emissionMedlem sedan dec. 19996 721 inlägg
#6

Troxy skrev:

emission, tack, det där ser lovande ut, med tanke på att du klarade dig utan en subquery :)
Jag ska försöka testköra den där frågan i morgon!

En sak jag undrar dock: Är t1 och t2 alias? Eller tabellnamn?
Om det är alias, var i frågan talar du om vilken tabell t1 är?

Det är alias, och jag glömde att definera dem...... :)

TroxyMedlem sedan mars 20041 505 inlägg
#7

Okay! :)
Jag kunde inte hålla mig, utan testkörde direkt.
Din fråga verkar fungera, dock om det rör sig om några hundra poster.
Men när det är tusentals så säger SQL-server ifrån efter 30 sekunders tuggande.
Det verkar som en LIKE-sats i en JOIN är en operation som kan hålla på i all oändlighet och ska undvikas...
Men om jag tar bort LIKE och kör en direkt jämförelse så går det igenom på några sekunder.
Så jag för väl strunta i LIKE och köra på det istället.

emissionMedlem sedan dec. 19996 721 inlägg
#8

En LIKE kan kosta en hel del, i synnerhet om den börjar med '%', så det kan du få leva med.

Frågan är, är det här verkligen något som du måste göra ofta?

emissionMedlem sedan dec. 19996 721 inlägg
#9

Troxy skrev:

Men när det är tusentals så säger SQL-server ifrån efter 30 sekunders tuggande.

Säger ifrån? Var kör du frågan?

TroxyMedlem sedan mars 20041 505 inlägg
#10

Jag kör frågan i Enterprise Manager.
"[Microsoft][ODBC SQL Server Driver]Timeout expired"

emissionMedlem sedan dec. 19996 721 inlägg
#11

Undvik Enterprise Manager för dylika bestyr. Använd Query Analyzer i stället.

133 ms totalt · 3 externa anrop · v20260731065814-full.29ac60f6
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)