La clave para manipular los rankings es utilizar una unión. Para cada columna, usa una instrucción select separada. En esa declaración, agregue un identificador que muestre desde qué columna se extrajo cada fila. Inserte los resultados en una variable de tabla, luego puede manipular la clasificación clasificando el identificador o multiplicando el rango por algún valor basado en el identificador.
La clave es dar la apariencia de modificar la clasificación, no cambiar realmente la clasificación del servidor SQL.
Ejemplo utilizando una variable de tabla:
DECLARE @Results TABLE (PersonId Int, Rank Int, Source Int)
para la tabla personas con columnas PersonId Int PK Identity, FirstName VarChar(100), MiddleName VarChar(100), LastName VarChar(100), AlsoKnown VarChar(100)
con cada columna añadió a un catálogo de texto completo, se puede utilizar la consulta:
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
El único inconveniente es Notarás que no usé UNION ALL
, por lo que si aparece una palabra en más de una columna, el rango no reflejará eso. Si eso es un problema, puede usar UNION ALL
y luego eliminar identificaciones de personas duplicadas agregando todo o parte del rango del registro duplicado al rango de otro registro con la misma identificación de persona.
¡Esto es extremadamente útil! Es una pena que esto no esté incorporado en SQL Server. –
sin embargo, esto no resume la clasificación ... – yeeen