5

我有一个包含两个表格的全文目录。

tableA 有 4 列(a1、a2、a3、a4),其中 3 列在目录 a2、a3、a4 中建立索引。a1 是主键。

tableB 有 3 列(b1、b2、b3、b4),其中两列在目录中被索引,b3 和 b4。b1 是这个表的 PK,b2 是表 A 的 FK。

我想做类似的事情

SELECT *, (ftTableA.[RANK] + ftTableB.[RANK]) AS total_rank 
FROM tableA
INNER JOIN tableB ON tableA.a1=tableB.b2
INNER JOIN FREETEXTTABLE(tableA, (a2,a3,a4), 'search term') as ftTableA ON tableA.a1=ftTableA.[KEY]
INNER JOIN FREETEXTTABLE(tableB, (b3,b4), 'search term') as ftTableB ON tableB.11=ftTableB.[KEY]

但这不起作用......我可以让一张桌子工作,例如。

SELECT *, (ftTableA.[RANK] + ftTableB.[RANK]) AS total_rank 
FROM tableA
INNER JOIN FREETEXTTABLE(tableA, (a2,a3,a4), 'search term') as ftTableA ON tableA.a1=ftTableA.[KEY]

但从不超过一张桌子。

有人可以给出对多个表进行全文搜索所需的步骤的解释和/或示例。

4

2 回答 2

4

如果 A 和相关 B 都包含搜索文本,则您的查询仅返回记录。

但是,您没有说明什么不起作用。

为什么不 LEFT OUTER JOIN 全文搜索,并替换:

SELECT *, (ISNULL(ftTableA.[RANK], 0) + ISNULL(ftTableB.[RANK], 0)) AS total_rank 

WHERE ftTableA.Key IS NOT NULL OR ftTableB.Key IS NOT NULL
于 2008-10-16T18:57:15.300 回答
2

我不确定我理解你想要做什么。我将您的问题解释为您想要返回表 A 中与搜索词匹配的所有项目。此外,您想将 TableA 中的项目加上 TableB 中的匹配项目的排名相加。

我能想到的最好方法是使用带有 3 个查询的表变量。

DECLARE @Results 表(a1 Int UNIQUE,Rank Int)

--将TableA中的所有匹配项插入@Results
插入@Results
(a1,等级)
(选择表A.a1,FT.Rank
FROM TableA INNER JOIN FreeTextTable(TableA, *, 'search term') FT
ON TableA.A1 = FT.[键]
)

--用当前值的总和加上以下的总和更新@Results中的所有排名
--所有子项(在表B中)
更新@Results
SET Rank = RS.Rank + FT.Rank
FROM @Results RS INNER JOIN 表B
在 RS.A1 = 表 B.b2
INNER JOIN FreeTextTable(TableB, *, 'search term') FT
ON TableB.b1 = FT.[键]

--现在将任何在 TableB 中匹配但在 TableA 中不匹配的项目插入到 @Results
--根据您的业务规则,可能需要/可能不需要此查询。
插入@Results
(SkillKeyId, 等级)
( SELECT TableB.b2, Sum(FT.Rank)
FROM TableB INNER JOIN FreeTextTable(TableB, *, 'search term') FT
ON TableB.b1 = FT.[键]
左连接 @Result RS
开 RS.a1 = 表 B.b2
RS.a1 为空
按表分组B.b2
)

--剩下的就是返回结果
SELECT TableA.*, RS.Rank AS Total_Rank
从表 A 内连接 @Results RS
在表 A.a1 = RS.a1
ORDER BY RS.Rank DESC

这不像使用一个查询那样优雅,但它应该很容易理解,并允许您决定是否在第三个查询中包含记录。

于 2008-10-16T18:44:19.070 回答