5

2 つのテーブルを含む全文カタログがあります。

tableA には 4 つの列 (a1、a2、a3、a4) があり、そのうち 3 つがカタログ a2、a3、a4 で索引付けされています。a1 は主キーです。

tableB には 3 つの列 (b1、b2、b3、b4) があり、そのうちの 2 つ (b3 と b4) がカタログで索引付けされています。b1 はこのテーブルの PK、b2 は tableA の 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]

ただし、テーブルは 1 つしかありません。

複数のテーブルの全文検索に必要な手順の説明や例を教えてください。

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 に挿入します。
@結果に挿入
(a1、ランク)
( SELECT TableA.a1, FT.Rank
FROM TableA INNER JOIN FreeTextTable(TableA, *, '検索語') FT
ON TableA.A1 = FT.[キー]
)

-- @Results のすべてのランクを、現在の値の合計と次の合計で更新します。
-- すべてのサブ項目 (TableB 内)
UPDATE @結果
SET ランク = RS.Rank + FT.Rank
FROM @Results RS INNER JOIN TableB
ON RS.A1 = TableB.b2
INNER JOIN FreeTextTable(TableB, *, '検索語') FT
ON TableB.b1 = FT.[キー]

-- ここで、TableB には一致するが TableA には一致しないアイテムを @Results に挿入します。
-- このクエリは、ビジネス ルールに基づいて必要な場合とそうでない場合があります。
@結果に挿入
(SkillKeyId、ランク)
( SELECT TableB.b2, Sum(FT.Rank)
FROM TableB INNER JOIN FreeTextTable(TableB, *, '検索語') FT
ON TableB.b1 = FT.[キー]
LEFT JOIN @Results RS
ON RS.a1 = TableB.b2
RS.a1 が NULL の場合
GROUP BY TableB.b2
)

-- あとは結果を返すだけです
SELECT TableA.*, RS.Rank AS Total_Rank
FROM TableA INNER JOIN @Results RS
ON TableA.a1 = RS.a1
ORDER BY RS.Rank DESC

これは 1 つのクエリを使用するほど洗練されていませんが、従うのは簡単で、3 番目のクエリにレコードを含めるかどうかを決定できます。

于 2008-10-16T18:44:19.070 に答える