Текстовый поиск отношения данных многие ко многим - PullRequest
2 голосов
/ 07 февраля 2012

Я знаю, что на этот вопрос уже должен быть дан ответ, но я просто не могу найти подходящий вопрос.

Используя 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   

Есть предложения?

Ответы [ 2 ]

4 голосов
/ 07 февраля 2012

Попробуй это.Отфильтруйте таблицу поиска, затем присоединитесь:

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 голос
/ 07 февраля 2012

Попробуйте:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...