2012-07-27 115 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表

谢谢..