2012-02-07 9 views
2

ここまではこれが返答されているに違いないが、私は単に一致する質問を見つけることができないことを知っている。多対多のデー​​タ関係のテキスト検索

LIKE '%keyword%'を使用して、MSSQLデータベースの多対多データ関係を検索し、それを1対1の結果セットに縮小したいと考えています。 2つのテーブルはリンクテーブルを介して結合されています。私がやりたいことはタイトルでフレーズを検索している

Books: 
book_ id title 
1   Treasure Island 
2   Poe Collected Stories 
3   Invest in Treasure Islands 

Categories: 
category_id name 
1   Children 
2   Adventure 
3   Horror 
4   Classic 
5   Money 

BookCategory: 
book_id category_id 
1   1 
1   2 
1   4 
2   3 
2   4 
3   5 

(例えば'%treasure island%')と検索文字列とシングルが含まれているブックの記録を照合得る:ここで私が話しているかの非常に単純化したバージョンです最高の一致Categories各本と一緒に行くレコード - 私はより小さいカテゴリのレコードを破棄したい。言い換えれば、私はこれを探しています:

book_id title      category_id name 
1  Treasure Island    4   Classic 
3  Invest in Treasure Islands 5   Money 

何か提案がありますか?

答えて

4

これを試してください。あなたのルックアップテーブルをフィルタリングし、その後、参加:

With maxCategories AS 
(select book_id, max(category_id) as category_id from BookCategory group by book_id) 
select Books.book_id, Books.Title, Categories.category_id, Categories.name 
from Books 
inner join maxCategories on (Books.book_id = maxCategories.book_id) 
inner join Categories on (Categories.category_id = maxCategories.category_id) 
where Books.title like '%treasure island%' 
1

試してみてください。あなたの答えのための

select * from 
(select b.*, 
     c.*, 
     row_number() over (partition by bc.book_id 
          order by bc.category_id desc) rn 
from Books b 
join BookCategory bc on b.book_id = bc.book_id 
join Categories c on bc.category_id = c.category_id 
where b.name like '%treasure island%') sq 
where rn=1 
+0

おかげでトン!あなたの答えと@N Westの答えは、私が望むものを正確に与えてくれました。両方をかなり徹底的にテストした結果、スピードの違いは見られませんでした(データサンプルはそれほど大きくないので、 )。だから両方の答えは同じように見えるが、@ N Westはコミュニティの方が新しいので、私は彼(または彼女)にチェックマークを与えている。再び、ありがとう! – Andrew