Reputation: 2396
Right now this query searches a table called article for entries who's title and abstract field's contain a certain keyword. The set it returns are articles who's title AND abstract contain the keyword, but I would like to change it so it returns articles who's title OR abstract contains the keyword. How would I accomplish this? By simply changing the inner joins to an outer?
BEGIN
with articlesearch as (
SELECT top 1000 FT_TBL.articleID, FT_TBL.title,FT_TBL.abstract,FT_TBL.publicationdate,
(select j.journalID from journal j where FT_TBL.journalID=j.journalID) as sourceID,
(select j.journalname from journal j where FT_TBL.journalID=j.journalID) as sourcename,
(select j2.medabbr from journal j2 where FT_TBL.journalID=j2.journalID) as medabbr,
(select j1.impactfactor from journal j1 where FT_TBL.journalID=j1.journalID) as impactfactor,
KEY_TBL.RANK,
ROW_NUMBER() OVER (ORDER BY KEY_TBL.RANK desc) AS RowNumber
FROM article AS FT_TBL
INNER JOIN
CONTAINSTABLE(article,title,@keyword) AS KEY_TBL
ON FT_TBL.articleID = KEY_TBL.[KEY]
INNER JOIN
CONTAINSTABLE(article,abstract,@keyword) AS KEY_TBL2
ON FT_TBL.articleID = KEY_TBL2.[KEY]
where FT_TBL.inactive=0
ORDER BY RANK DESC
)
SELECT articleID, sourcename,title,abstract,publicationdate,medabbr
FROM articlesearch
WHERE RowNumber BETWEEN @RowStart AND @RowEnd ORDER BY publicationdate desc;
END
Upvotes: 0
Views: 73
Reputation: 1269973
The following version changes the inner join
s to left outer join
s and adds a where
clause to get what you want:
with articlesearch as (
SELECT top 1000 FT_TBL.articleID, FT_TBL.title,FT_TBL.abstract,FT_TBL.publicationdate,
(select j.journalID from journal j where FT_TBL.journalID=j.journalID) as sourceID,
(select j.journalname from journal j where FT_TBL.journalID=j.journalID) as sourcename,
(select j2.medabbr from journal j2 where FT_TBL.journalID=j2.journalID) as medabbr,
(select j1.impactfactor from journal j1 where FT_TBL.journalID=j1.journalID) as impactfactor,
KEY_TBL.RANK,
ROW_NUMBER() OVER (ORDER BY KEY_TBL.RANK desc) AS RowNumber
FROM article AS FT_TBL
left outer JOIN
CONTAINSTABLE(article,title,@keyword) AS KEY_TBL
ON FT_TBL.articleID = KEY_TBL.[KEY]
left outer join
CONTAINSTABLE(article,abstract,@keyword) AS KEY_TBL2
ON FT_TBL.articleID = KEY_TBL2.[KEY]
where FT_TBL.inactive=0 and (key_tbl.[key] is not null or key_tbl2.[key] is not null)
ORDER BY RANK DESC
)
SELECT articleID, sourcename,title,abstract,publicationdate,medabbr
FROM articlesearch
WHERE RowNumber BETWEEN @RowStart AND @RowEnd ORDER BY publicationdate desc;
Upvotes: 2
Reputation: 28718
You'll need to change the INNER JOIN
to an OUTER
, as DigitalD notes, but then you also need to filter your results where at least one of the joins isn't empty.
-- snip
----
-- /snip
FROM article AS FT_TBL
LEFT OUTER JOIN
CONTAINSTABLE(article,title,@keyword) AS KEY_TBL
ON FT_TBL.articleID = KEY_TBL.[KEY]
LEFT OUTER JOIN
CONTAINSTABLE(article,abstract,@keyword) AS KEY_TBL2
ON FT_TBL.articleID = KEY_TBL2.[KEY]
WHERE FT_TBL.inactive=0
AND (KEY_TBL.[KEY] IS NOT NULL OR KEY_TBL2.[KEY] IS NOT NULL)
ORDER BY RANK DESC
)
-- snip
----
-- /snip
Upvotes: 0
Reputation: 4310
Looks like you could change the INNER JOIN
on each to a LEFT JOIN
and that would get you what you want. Though I'll admit I'm not familiar with CONTAINSTABLE
Upvotes: 0