ランキングを操作するための鍵は、ユニオンを使用することです。列ごとに、個別のselectステートメントを使用します。そのステートメントに、各行がどの列からプルされたかを示す識別子を追加します。結果をテーブル変数に挿入すると、識別子で並べ替えたり、識別子に基づいてランクに値を掛けたりして、ランキングを操作できます。
重要なのは、SQLサーバーのランキングを実際に変更するのではなく、ランキングを変更しているように見せることです。
テーブル変数を使用した例:
DECLARE @Results TABLE (PersonId Int, Rank Int, Source Int)
各列がフルテキストカタログに追加されたテーブルPeoplewithColumnsPersonId Int PK Identity, FirstName VarChar(100), MiddleName VarChar(100), LastName VarChar(100), AlsoKnown VarChar(100)
の場合、次のクエリを使用できます。
INSERT INTO @Results (PersonId, Rank, Source)
SELECT PersonId, Rank, 1
FROM ContainsTable(People, FirstName, @SearchValue) CT INNER JOIN People P ON CT.Key = P.PersonId
UNION
SELECT PersonId, Rank, 2
FROM ContainsTable(People, MiddleName, @SearchValue) CT INNER JOIN People P ON CT.Key = P.PersonId
UNION
SELECT PersonId, Rank, 3
FROM ContainsTable(People, LastName, @SearchValue) CT INNER JOIN People P ON CT.Key = P.PersonId
UNION
SELECT PersonId, Rank, 4
FROM ContainsTable(People, AlsoKnown, @SearchValue) CT INNER JOIN People P ON CT.Key = P.PersonId
/*
Now that the results from above are in the @Results table, you can manipulate the
rankings in one of several ways, the simplest is to pull the results ordered first by Source then by Rank. Of course you would probably join to the People table to pull the name fields.
*/
SELECT PersonId
FROM @Results
ORDER BY Source, Rank DESC
/*
A more complex manipulation would use a statement to multiply the ranking by a value above 1 (to increase rank) or less than 1 (to lower rank), then return results based on the new rank. This provides more fine tuning, since I could make first name 10% higher and middle name 15% lower and leave last name and also known the original value.
*/
SELECT PersonId, CASE Source WHEN 1 THEN Rank * 1.1 WHEN 2 THEN Rank * .9 ELSE Rank END AS NewRank FROM @Results
ORDER BY NewRank DESC
1つの欠点は、私が使用しなかったことに気付くでしょう。UNION ALL
そのため、単語が複数の列に表示された場合、ランクはそれを反映しません。UNION ALL
それが問題である場合は、重複するレコードのランクのすべてまたは一部を同じ個人IDを持つ別のレコードのランクに追加することにより、重複する個人IDを使用して削除できます。