2008-10-15 10 views
5

Tengo un catálogo de texto completo con dos tablas en él.¿Cómo uso la búsqueda de texto completo en varias tablas, SQL Server 2005

tableA tiene 4 columnas (a1, a2, a3, a4) de las cuales 3 están indexadas en el catálogo, a2, a3, a4. a1 es la clave principal.

tablaB tiene 3 columnas (b1, b2, b3, b4), dos de las cuales están indexadas en el catálogo, b3 y b4. b1 es el PK de esta tabla, b2 es el FK de la tabla A.

quiero hacer algo como

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] 

Pero esto no funciona ... puedo conseguir una sola tabla para trabajar, por ejemplo.

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] 

pero nunca más de una tabla.

Podría alguien dar una explicación y/o un ejemplo de los pasos requeridos para la búsqueda de texto completo en varias tablas.

Respuesta

2

No estoy seguro de haber entendido lo que estabas tratando de hacer. Interpreté su pregunta porque desea devolver todos los elementos de la Tabla A que coinciden con el término de búsqueda. Además, quería sumar el rango del elemento en la Tabla A más los elementos coincidentes en la Tabla B.

La mejor manera que puedo pensar para hacer esto es usar una variable de tabla con 3 consultas.

DECLARE @Results Table (a1 Int UNIQUE, Rank Int) 

--Insert into @Results all matching items from TableA 
INSERT INTO @Results 
(a1, Rank) 
(SELECT TableA.a1, FT.Rank 
FROM TableA INNER JOIN FreeTextTable(TableA, *, 'search term') FT 
ON TableA.A1 = FT.[Key] 
) 

--Update all of the ranks in @Results with a sum of current value plus the sum of 
--all sub items (in TableB) 
UPDATE @Results 
SET Rank = RS.Rank + FT.Rank 
FROM @Results RS INNER JOIN TableB 
ON RS.A1 = TableB.b2 
INNER JOIN FreeTextTable(TableB, *, 'search term') FT 
ON TableB.b1 = FT.[Key] 

--Now insert into @Results any items that has a match in TableB but not in TableA 
--This query may/may not be desired based on your business rules. 
INSERT INTO @Results 
(SkillKeyId, Rank) 
(SELECT TableB.b2, Sum(FT.Rank) 
FROM TableB INNER JOIN FreeTextTable(TableB, *, 'search term') FT 
ON TableB.b1 = FT.[key] 
LEFT JOIN @Results RS 
ON RS.a1 = TableB.b2 
WHERE RS.a1 IS NULL 
GROUP BY TableB.b2 
) 

--All that's left is to return the results 
SELECT TableA.*, RS.Rank AS Total_Rank 
FROM TableA INNER JOIN @Results RS 
ON TableA.a1 = RS.a1 
ORDER BY RS.Rank DESC 

Esto no es tan elegante como el uso de una consulta, pero debe ser fácil de seguir y le permite decidir si desea o no incluir registros de la consulta tercero.

4

Su consulta solo devuelve registros, si tanto A como B relacionados contienen el texto de búsqueda.

No dice lo que no funciona, sin embargo.

Por qué no LEFT OUTER JOIN las búsquedas de texto completo, y reemplazar:

SELECT *, (ISNULL(ftTableA.[RANK], 0) + ISNULL(ftTableB.[RANK], 0)) AS total_rank 

y

WHERE ftTableA.Key IS NOT NULL OR ftTableB.Key IS NOT NULL 
Cuestiones relacionadas