使用联合是操纵排名的关键。对于每一列,您需要使用单独的select语句。在该语句中,添加一个标识符来显示从哪个列中提取了每行,然后将结果插入到表变量中,然后您可以通过排序标识符或根据标识符乘以某个值来操作排名。
关键是要给出修改排名的外观,而不是实际更改sql服务器的排名。
以下是使用表变量的示例:
DECLARE @Results TABLE (PersonId Int, Rank Int, Source Int)
对于具有列PersonId Int PK Identity, FirstName VarChar(100), MiddleName VarChar(100), LastName VarChar(100), AlsoKnown VarChar(100)
的表People,每个列都添加到全文目录中,您可以使用以下查询:
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
SELECT PersonId
FROM @Results
ORDER BY Source, Rank DESC
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
唯一的缺点是我没有使用UNION ALL
,因此如果一个单词出现在多列中,排名将不会反映出来。 如果这是一个问题,您可以使用UNION ALL
,然后通过将重复记录的全部或部分排名添加到具有相同个人ID的另一条记录的排名来删除重复的人员ID。