webForumDet fria alternativet

JOIN och LIKE

10 svar · 643 visningar · startad av inspiro

inspiroMedlem sedan sep. 2005664 inlägg
#1

Hej! Jag skulle vilja ha typ en sån här sql-sats:

SELECT     UserObjects.UserID, ExchangeObjects.UserID AS ExchangeUserID, ExchangeObjects.Stuff
FROM         UserObjects INNER JOIN
                      ExchangeObjects ON UserObjects.Stuff [blue][B]LIKE %ExchangeObjects.Stuff%[/B][/blue]
WHERE     (UserObjects.UserID = 1)

Den blåmarkerade texten är problemet. Jag vill alltså hämta även de poster som bara innehåller en del av texten från UserObjects.Stuff på nåt sätt...

LarsGMedlem sedan dec. 200012 465 inlägg
#2
SELECT UserObjects.UserID, 
           ExchangeObjects.UserID AS ExchangeUserID, 
           ExchangeObjects.Stuff
  FROM  UserObjects INNER JOIN
           ExchangeObjects ON UserObjects.Stuff LIKE '%' || ExchangeObjects.Stuff || '%'
WHERE UserObjects.UserID = 1

Det där är aldrig bra i längden.

inspiroMedlem sedan sep. 2005664 inlägg
#3

Varför inte? Menar du att det finns ett bättre sätt att göra samma sak eller att man inte ska göra så alls? Jag vill alltså att "hej" även ska plocka ut "hejsan"!

Jag får tyvärr "Incorrect syntax near '|' när jag kör koden ovan...

Använder sql server 2005 om jag inte skrev det.

LarsGMedlem sedan dec. 200012 465 inlägg
#4
SELECT UserObjects.UserID, 
           ExchangeObjects.UserID AS ExchangeUserID, 
           ExchangeObjects.Stuff
  FROM  UserObjects INNER JOIN
           ExchangeObjects ON UserObjects.Stuff LIKE '%' + ExchangeObjects.Stuff + '%'
WHERE UserObjects.UserID = 1

Det som inte är bra är att du får sekventiella läsningar vilket oftast är förödande för prestanda.

inspiroMedlem sedan sep. 2005664 inlägg
#5

Jag får tyvärr inte några träffar på delar av ord ändå. Det blir inget fel men svaren blir samma som om jag skulle ha UserObjects.Stuff = ExchangeObjects.Stuff ...

Vad menas med sekventiella läsningar? Går det att göra något liknande men med bättre prestanda?

LarsGMedlem sedan dec. 200012 465 inlägg
#6

Nej, det går inte att undvika sekventiella läsningar då du har like med inledande %

En sekventiell läsningar innebär att man läser all poster i tabellen.

kan du ge exempel på datainnehåll i de båda kolumnerna?

emissionMedlem sedan dec. 19996 095 inlägg
#7

För att förtydliga det som LarsG påpekar..

Man får sekventella läsningar, vilket innebär att databasmotorn måste "loopa" igenom alla rader i tabellen och undersöka om de uppfyller kriteriet.

Exempel:

SELECT * FROM tabell WHERE kolumn LIKE 'a%'

Databasen kan kolla i ett index (om ett sådant existerar) och vet direkt att den bara behöver kontrollera de rader i indexet som börjar på "a". Indexet är, grovt förenklat, organiserat med begynnelsebokstäverna i alfabetisk ordning.

SELECT * FROM tabell WHERE kolumn LIKE '%a'

Databasen vet helt plötsligt inget om hur den ska hitta raderna, och måste läsa igenom hela tabellen i jakt på rätt data.

inspiroMedlem sedan sep. 2005664 inlägg
#8

Det är vanliga ord, testade exempelvis med "Bil" vilket jag försöker joina med "Bilar". Columnen är av typen nvarchar(50).

emissionMedlem sedan dec. 19996 095 inlägg
#9

Det är inte så att du vänt på relationen?

SELECT UserObjects.UserID, 
           ExchangeObjects.UserID AS ExchangeUserID, 
           ExchangeObjects.Stuff
  FROM  UserObjects INNER JOIN
           ExchangeObjects ON ExchangeObjects.Stuff LIKE '%' + UserObjects.Stuff + '%'
WHERE UserObjects.UserID = 1
inspiroMedlem sedan sep. 2005664 inlägg
#10

emission skrev:

SELECT * FROM tabell WHERE kolumn LIKE '%a'

Databasen vet helt plötsligt inget om hur den ska hitta raderna, och måste läsa igenom hela tabellen i jakt på rätt data.

Ahaa, då är jag med... viss skillnad. Ett bättre alternativ är alltså att lägga varje ord i en egen kolumn och bara sätta % i slutet. Men det blir ju lite krångligare och viss funktionalitet förlorar jag ju ändå. Jag ska alltså göra en slags sökmotor tänkte jag!

inspiroMedlem sedan sep. 2005664 inlägg
#11

Tack så mycket för all hjälp, visst hade jag vänt det hela fel!!! :)

Genererad på 388 ms · cache AV · v20260730165559-full.f96bc7eb