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...
SELECT UserObjects.UserID,
ExchangeObjects.UserID AS ExchangeUserID,
ExchangeObjects.Stuff
FROM UserObjects INNER JOIN
ExchangeObjects ON UserObjects.Stuff LIKE '%' || ExchangeObjects.Stuff || '%'
WHERE UserObjects.UserID = 1
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...
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.
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?
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.
SELECT UserObjects.UserID,
ExchangeObjects.UserID AS ExchangeUserID,
ExchangeObjects.Stuff
FROM UserObjects INNER JOIN
ExchangeObjects ON ExchangeObjects.Stuff LIKE '%' + UserObjects.Stuff + '%'
WHERE UserObjects.UserID = 1
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!