我正在尝试进行一些自由文本搜索匹配,并想知道我是否可以改进此查询(使用MSSQL 2008):
@FreeText是一个表,其中每一行都是一个搜索词
DECLARE @WordCount = (SELECT COUNT(*) from @FreeText)
SELECT p.ID
FROM Product p
OUTER APPLY
(
SELECT COUNT(ID) as MatchCount
FROM Product pm
INNER JOIN @FreeText ft
ON pm.txt like '%'+ft.text+'%'
WHERE pm.ID = p.ID
AND (SELECT TOP 1 [text] FROM @FreeText) IS NOT NULL
)MC
WHERE MatchCount = @WordCount
所以我想知道是否有办法避免外部申请中的“FROM Product pm
”?
我不能总是INNER JOIN @FreeText
,因为有时候我们不会使用自由文本搜索。
任何想法或提示都将不胜感激,如果我能澄清任何事情,请告诉我。提前谢谢。
P.S。我知道MS SQL有一个FREETEXT()搜索,但遗憾的是我暂时无法使用它。
答案 0 :(得分:1)
这是一个没有OUTER APPLY的查询,当没有搜索标准时返回所有结果。
DECLARE @FreeText TABLE
(
[text] varchar(200)
)
INSERT INTO @FreeText SELECT 'a'
INSERT INTO @FreeText SELECT 'c'
-- what, null? No.
DELETE FROM @FreeText WHERE [text] is null
DECLARE @WordCount int
SET @WordCount = (SELECT Count(*) FROM @FreeText)
SELECT p.ID
FROM Product p
LEFT JOIN @FreeText ft
ON p.txt like '%' + ft.text + '%'
WHERE ft.text is not null OR @WordCount = 0
GROUP BY p.ID
HAVING COUNT(*) = @WordCount OR @WordCount = 0
注意:当没有任何自由文本标准时,我不会使用“自由文本”查询 - 而是使用另一个查询(更简单)。如果您选择走这条路线 - 请返回INNER JOIN
并放弃OR @WordCount = 0
x2。