Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 多对多数据关系的文本搜索_Sql_Tsql_Many To Many - Fatal编程技术网

Sql 多对多数据关系的文本搜索

Sql 多对多数据关系的文本搜索,sql,tsql,many-to-many,Sql,Tsql,Many To Many,我知道这个问题在这里之前肯定已经得到了回答,但我就是找不到一个匹配的问题 使用像“%keyword%”这样的,我想在MSSQL数据库中搜索多对多数据关系,并将其简化为一对一的结果集。这两个表通过链接表连接。下面是我所说内容的一个非常简化的版本: Books: book_ id title 1 Treasure Island 2 Poe Collected Stories 3 Invest in Treasure Islands Categori

我知道这个问题在这里之前肯定已经得到了回答,但我就是找不到一个匹配的问题

使用像“%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
我要做的是在标题中搜索一个短语(例如,
“%金银岛%”
),并获得匹配的图书记录,其中包含搜索字符串和每本书附带的单个最高匹配的
类别
记录——我要丢弃较小的类别记录。换句话说,我在寻找这个:

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

有什么建议吗?

试试这个。筛选查找表,然后加入:

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%'
尝试:


非常感谢你的回答!您的答案和@N West的答案都给出了我想要的答案,在对这两个答案进行了彻底的测试之后,我看不到速度上的差异(我拥有的数据样本不是很大,所以可能还不会出现性能问题)。所以这两个答案似乎是相同的,但既然@N West对社区来说是新的,我就给他(或她)打勾。再次感谢!
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