inspiroMedlem sedan sep. 2005664 inlägg
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
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
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
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
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
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
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
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
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
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
Tack så mycket för all hjälp, visst hade jag vänt det hela fel!!! :)