2008-10-15 8 views
5

두 개의 테이블이있는 전체 텍스트 카탈로그가 있습니다.여러 테이블 (SQL Server 2005)에서 전체 텍스트 검색을 사용하는 방법

tableA에는 카탈로그 3, a2, a3, a4에 색인 된 4 개의 열 (a1, a2, a3, a4)이 있습니다. a1이 기본 키입니다.

tableB에는 3 개의 열 (b1, b2, b3, b4)이 있으며 두 개는 카탈로그 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] 

하나 이상의 테이블.

누군가 여러 테이블에 대한 전체 텍스트 검색에 필요한 단계 및/또는 예제를 제공 할 수 있습니까?

답변

2

나는 당신이하려는 것을 이해한다는 것에 긍정적이지 않습니다. 검색어와 일치하는 표 A의 모든 항목을 반환하려는 경우 질문을 해석했습니다. 또한 TableA의 항목과 TableB의 일치하는 항목의 순위를 합산하려고합니다.

내가 생각하기에 가장 좋은 방법은 3 개의 쿼리와 함께 테이블 변수를 사용하는 것입니다.

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 

이 하나의 쿼리를 사용하는 것만 큼 우아한 아니지만, 쉽게 따라 할 수 있어야하고 셋째 쿼리의 레코드를 포함할지 여부를 결정할 수 있습니다.

4

A와 관련 B 모두에 검색 텍스트가 포함 된 경우 쿼리는 레코드 만 반환합니다.

하지만 작동하지 않는 것은 설명하지 마십시오.

하지 LEFT OUTER가 전체 텍스트 검색을 가입하고, 교체 이유 :

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

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