2012-02-07 56 views
2

我知道这一定是在这之前得到的答案,但我根本找不到匹配的问题。多对多数据关系的文本搜索

使用LIKE '%keyword%',我想要搜索MSSQL数据库中的多对多数据关系,并将其减少为一对一的结果集。这两个表通过链接表连接起来。下面是我在谈论的一个非常简化的版本:

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 2012-02-07 15:10:04