2012-07-27 98 views
0
SELECT A.a, B.b, akt.[Rank] + bkt.[Rank] /2 AS [Rank] 
FROM B b 
INNER JOIN Publication a ON a.Id = b.Id 
INNER JOIN FREETEXTTABLE(A, a, 'search text') akt ON a.Id = akt.[Key] 
INNER JOIN FREETEXTTABLE(B, b, 'search text') bkt ON b.Id = bkt.[Key] 
ORDER BY [Rank] DESC 

UNION 
SELECT A.a, null as B.b, akt.[Rank] as [Rank] 
FROM A a 
INNER JOIN FREETEXTTABLE(A, a, 'search text') akt ON a.Id = akt.[Key] 

UNION 
SELECT null as A.a, B.b, bkt.[Rank] as [Rank] 
FROM B b 
INNER JOIN FREETEXTTABLE(A, a, 'search text') akt ON a.Id = akt.[Key] 

以上查詢用於跨兩個表搜索記錄(使用排名)。使用跨多個表的全文搜索搜索記錄

第一個查詢:只有那些記錄顯示在兩個表格的兩列中的搜索文本中。

第二個查詢:只有那些記錄,SEARCHTEXT僅在列的表的

第三個查詢:只有那些記錄,SEARCHTEXT僅列B表B中

我的問題是:如果我必須搜索4或5個表格,聯合會的數量會瘋狂增加。它也會太複雜和緩慢。

那麼,有沒有其他方法可以減少這些聯盟? 我試過了Views,但是它們不能被全文索引。

回答

0

只需使用全加入

SELECT A.a, B.b, "Use case for calculating rank" 
    FROM B b 
    FULL JOIN A a ON b.Id = a.Id 
WHERE 
    a.[columnname] = 'search text' OR 
    b.[columnname] = 'search text' 

檢查http://codesnout.com/SQLSample/SQL-FULL-JOIN.php

+0

謝謝雨,這是工作,但排名僅來爲那些同時在列的記錄,對於其他人來說,排名= NULL – Marcus25 2012-07-27 07:24:18

+0

是,排名將是無效的。那就是爲什麼我告訴你用套子來計算等級。請顯示您正在使用的確切腳本,然後我會檢查。 – Narendra 2012-07-27 07:33:52

0
SELECT b.FK_Publication_ID, b.PageNumber as PageNumber, b.SearchText as SearchText, a.Title as Title , 
TitleSearch.[Rank] + PubSearch.[Rank] * 10000 
    AS [Rank] 
FROM PublicationSearch 
INNER JOIN Publication a ON b.FK_Publication_Id = a.Id 
INNER JOIN FREETEXTTABLE(PublicationSearch, SearchText, "searchtext") PubSearch ON b.Id = PubSearch.[Key] 
INNER JOIN FREETEXTTABLE(Publication, Title, "searchtext") TitleSearch ON a.Id = TitleSearch.[Key] 
WHERE b.FK_ContentType_Id IN (SELECT * FROM UF_CSVToTable(@Options)) 

UNION 


SELECT a.Id, null as PageNumber, null as Searchtext, a.Title as Title, TitleSearch.[Rank] * 100 AS [Rank] 
FROM Publication a 
INNER JOIN FREETEXTTABLE(Publication,Title, "searchtext") TitleSearch ON a.Id = TitleSearch.[Key] 


UNION 

SELECT b.FK_Publication_ID, b.PageNumber as PageNumber, b.SearchText as SearchText, null as Title, 
PubSearch.[Rank] 
    AS [Rank] 
FROM PublicationSearch b 
INNER JOIN FREETEXTTABLE(PublicationSearch, SearchText, "searchtext") PubSearch ON b.Id = PubSearch.[Key] 

ORDER BY [Rank] DESC 

以上是使用UNION

下面是如你所說

SELECT b.FK_Publication_ID,b.PageNumber作爲PageNumber,b.SearchText作爲SearchText,a作爲Ti的標題如ContentType,

TitleSearch.[Rank] * 100 (Ranking, dont know how to do it here) 
    AS [Rank] 
FROM PublicationSearch b 
INNER JOIN Publication a ON b.FK_Publication_Id = a.Id 
JOIN FREETEXTTABLE(PublicationSearch, SearchText, "searchtext")PubSearch ON b.Id = PubSearch.[Key] 
FULL JOIN FREETEXTTABLE(Publication, Title, "searchtext")TitleSearch ON a.Id = TitleSearch.[Key] 

order by [RANK] desc 

繼承人,確切的腳本。使用完全加入,我從BOTH表中獲得記錄,僅從PublicationSearch表中獲得記錄,但不僅從發佈表

中獲得記錄,而且在兩個表中找到的記錄應該排在更高的位置,然後記錄來自發布表和然後記錄PublicationSerach表

謝謝..