Gre*_*g B 5 full-text-search sql-server-2005 multiple-tables
我有一个包含两个表的全文目录.
tableA在目录中索引了4列(a1,a2,a3,a4),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]
Run Code Online (Sandbox Code Playgroud)
但这不起作用......我可以让单个表工作,例如.
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]
Run Code Online (Sandbox Code Playgroud)
但从不超过一张桌子.
有人可以给出对多个表进行全文搜索所需步骤的解释和/或示例.
小智 2
我不确定我理解你想要做什么。我将您的问题解释为您想要返回表 A 中与搜索词匹配的所有项目。此外,您想要对 TableA 中的项目加上 TableB 中的匹配项目的排名求和。
我能想到的最好方法是使用带有 3 个查询的表变量。
DECLARE @Results Table (a1 Int UNIQUE, Rank Int) --将TableA中的所有匹配项插入到@Results中 插入@Results (a1,排名) ( SELECT TableA.a1, FT.Rank FROM TableA INNER JOIN FreeTextTable(TableA, *, '搜索词') FT ON 表A.A1 = FT.[关键] ) --用当前值加上总和来更新@Results中的所有排名 --所有子项(在TableB中) 更新@结果 SET Rank = RS.Rank + FT.Rank FROM @Results RS INNER JOIN 表B ON RS.A1 = 表B.b2 INNER JOIN FreeTextTable(TableB, *, '搜索词') FT ON 表B.b1 = FT.[关键] --现在将在 TableB 中匹配但在 TableA 中不匹配的任何项目插入到 @Results 中 -- 根据您的业务规则,可能需要/可能不需要此查询。 插入@Results (技能键 ID、等级) ( SELECT TableB.b2, Sum(FT.Rank) FROM TableB INNER JOIN FreeTextTable(TableB, *, '搜索词') FT ON 表B.b1 = FT.[key] 左连接@结果RS ON RS.a1 = 表B.b2 其中 RS.a1 为 NULL 分组依据表B.b2 ) --剩下的就是返回结果了 SELECT TableA.*, RS.Rank AS Total_Rank FROM TableA INNER JOIN @Results RS ON 表A.a1 = RS.a1 按 RS.Rank DESC 排序
这不像使用一个查询那么优雅,但它应该很容易理解,并允许您决定是否在第三个查询中包含记录。