трудности с SQL-запросом с использованием базы данных Oracle - PullRequest
0 голосов
/ 26 января 2012

вопрос:

Найдите название книг, ключевое слово которых содержит последние 3 символа группы книг, заказанной "Мистером Каримом".

Я пытаюсь сделать это так:

SELECT Title 
FROM Lib_Book 
WHERE BookKeywords LIKE '%(SELECT BookGroup FROM Lib_Book WHERE BookId=(SELECT BookId from Lib_Booking, Lib_Borrower WHERE Lib_Booking.BId=Lib_Borrower.BId AND Lib_Borrower.BName = 'Mr. Karim'))%'; 

от части после% до конца возвращает мне ответ «программирование». поэтому мне нужно указать BookKeyword как «% ing%». Как я могу это сделать?

** Таблицы огромные, так что я их здесь написал ... если кому-то нужно, пожалуйста, позвольте мне знать ... thnx

1 Ответ

0 голосов
/ 26 января 2012

У вас есть базовая концепция, хотя невозможно обработать оператор 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'

Обратите внимание на следующие предостережения:

  1. Это даст вам все названия для всех книг с ключевыми словами, аналогичными всем заимствованным книгам (у всех "Мистера Карима"). При присоединении к Lib_Booking.
  2. Столбец bookKeywords выглядит потенциально как столбец с несколькими значениями (потребуется пример данных). Если это так, ваша структура таблицы нуждается в для пересмотра.
  3. Использование SUBSTRING() или RIGHT() сделает недействительным использование inidicies при присоединении к столбцу bookGroup. Вы ничего не можете с этим поделать, учитывая ваши требования ...
  4. Эта таблица не является интернационализированной (поскольку столбец bookGroup является языковым анализируемым текстом). Вы можете лучше справиться с ситуацией, создав таблицу Book_Group, таблицу Keywords и таблицу перекрестных ссылок Book_Keywords и присоединившись к числовым идентификаторам. Вам также могут понадобиться таблицы с ключами языка Book_Group_Description и Keyword_Description. Это займет больше места, а , вероятно, займет больше времени обработки (увеличенное количество объединений, хотя потенциально меньше текстовой обработки), но даст вам большую гибкость и «безопасность».
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...