У вас есть базовая концепция, хотя невозможно обработать оператор SELECT
внутри предложения LIKE
(и я бы, вероятно, застрелил разработчика RDBMS, который допустил это - это GAPING HUGE HOLE для SQL-инъекций). Кроме того, у вас могут возникнуть проблемы с несколькими результатами, поскольку ваш «запрос» потерпит неудачу в тот момент, когда мистер Карим одолжил более одной книги.
Вероятно, я бы начал с попытки заставить вещи работать без соединений (о, и никогда не использовать неявный синтаксис соединений):
SELECT d.title
FROM Lib_Borrower as a
JOIN Lib_Booking as b
ON b.bId = a.bId
JOIN Lib_Book as c
ON c.bookId = b.bookId
JOIN Lib_Book as d
ON d.bookKeywords LIKE '%' + SUBSTRING(c.bookGroup, LENGTH(c.bookGroup) - 3) + '%'
WHERE a.bName = 'Mr. Karim'
Обратите внимание на следующие предостережения:
- Это даст вам все названия для всех книг с ключевыми словами, аналогичными всем заимствованным книгам (у всех "Мистера Карима"). При присоединении к
Lib_Booking
.
- Столбец
bookKeywords
выглядит потенциально как столбец с несколькими значениями (потребуется пример данных). Если это так, ваша структура таблицы нуждается в для пересмотра.
- Использование
SUBSTRING()
или RIGHT()
сделает недействительным использование inidicies при присоединении к столбцу bookGroup
. Вы ничего не можете с этим поделать, учитывая ваши требования ...
- Эта таблица не является интернационализированной (поскольку столбец
bookGroup
является языковым анализируемым текстом). Вы можете лучше справиться с ситуацией, создав таблицу Book_Group
, таблицу Keywords
и таблицу перекрестных ссылок Book_Keywords
и присоединившись к числовым идентификаторам. Вам также могут понадобиться таблицы с ключами языка Book_Group_Description
и Keyword_Description
. Это займет больше места, а , вероятно, займет больше времени обработки (увеличенное количество объединений, хотя потенциально меньше текстовой обработки), но даст вам большую гибкость и «безопасность».