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]

上記のクエリは、2 つのテーブル間で (ランキングを使用して) レコードを検索するためのものです。

最初のクエリ :検索テキストが 2 つのテーブルの両方の列にあるレコードのみが表示されます。

2 番目のクエリ: 検索テキストがテーブル A の列 a にのみあるレコードのみ

3 番目のクエリ: searchtext がテーブル B の列 b にのみあるレコードのみ

私の質問は、4 つまたは 5 つのテーブルを検索する必要がある場合、UNIONS の数が狂ったように増加することです。複雑すぎて遅くなります。

それで、これらのUNIONSを減らすことができる他の方法はありますか? ビューを試しましたが、全文索引を作成できません。

4

2 に答える 2

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 を確認してください

于 2012-07-27T06:23:14.260 に答える
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.Title を Title として 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

これが正確なスクリプトです。完全結合を使用して、両方のテーブルからレコードを取得し、PublicationSearch テーブルのみからレコードを取得しますが、Publication テーブルからのみ取得するわけではありません

また、両方のテーブルで見つかったレコードを上位にランク付けしてから、Publication テーブルのみのレコードと PublicationSerach テーブルのレコードをランク​​付けする必要があります。

ありがとう..

于 2012-07-27T08:23:43.813 に答える