2013-04-28 3 views
0

У меня проблема с домашней работой моей базы данных. Мне нужно написать подзапрос, в котором будет отображаться ISBN и название книги, в которой есть категория, которая начинается с буквы «S».ошибка 1242 подзапрос возвращает более 1 строки

столы: BOOK (ISBN, Категория, название, описание, выпуск, PublisherID) и категории (CatID, CatDescription)

ключи: BOOK (ISBN_PK, Category_FK) и КАТЕГОРИЯ (CatID_PK) ---> Категория = CatID

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

Мой код:

SELECT ISBN, title FROM book WHERE category LIKE (SELECT catdescription FROM category WHERE catdescription LIKE 's%') 
+0

'LIKE' ожидает единственный аргумент, а не список. –

+0

Замечание о дизайне схемы: если Book.category является внешним ключом для Category.CatID, может быть предпочтительнее назвать его Book.CatID. Таким образом, соответствие сразу становится очевидным. Он также открывает возможность использования [Natural Join] (http://en.wikipedia.org/wiki/Join_ (SQL) #Natural_join). –

+0

Также было бы очевидно, что 'book.category' не соответствует' category.catdescription'. Вы захотите сделать 'select CatID' в подзапросе, а не' select catedescription'. –

ответ

2

вы можете объединять обе таблицы, а не с помощью подзапроса,

SELECT a.* 
FROM book a 
     INNER JOIN category b 
      ON a.Category = b.CatID 
WHERE b.CatDescription LIKE 'S%' 

Для дальнейшего получить больше знаний о присоединяется, любезно перейдите по ссылке ниже:


Рассмотрите возможность использования FULLTEXTSEARCH, а не LIKE, если вы используете MyISAM двигатель.

+1

Объединение таблиц - это сердце реляционных баз данных. –

+0

В этом вопросе говорится, что ему нужно использовать подзапрос. –

+0

@JoelNelson да, но я получаю еще лучший способ, чем подзапрос. Вы можете добавить его в свой ответ, как это сделать, используя подзапрос. –

0

изменение LIKE И.Н.

SELECT ISBN, title FROM book WHERE title IN (SELECT catdescription FROM category WHERE catdescription LIKE 's%') 

EDIT:

SELECT ISBN, title FROM book WHERE ISBN IN (SELECT catdescription FROM category WHERE catdescription LIKE 's%') 
OR title IN (SELECT catdescription FROM category WHERE catdescription LIKE 's%') 
+0

Он возвращает пустой набор –

+0

, потому что вы выбрали категорию, чтобы быть как .. когда категория является именем таблицы, я думаю, вы хотите сделать заголовок, который нравится ...., попробуйте мой обновленный ответ –

+0

Все еще ничего. Результат должен дать мне ISBN и название, которые имеют соответствующую категорию, которая начинается с буквы «s». Теперь я попытаюсь загрузить изображение диаграммы и нужный вывод, если смогу. –

0

Вы не можете использовать как на подзапросом. Скорее всего, будет работать и переход на следующий запрос.

SELECT ISBN, title 
    FROM book 
    WHERE category in (SELECT catdescription 
         FROM category WHERE catdescription LIKE 's%') 

Это предполагает, что поле book.category соответствует полю category.catdescription.

+0

Вы уверены, что это не сработает, если подзапрос вернет одну строку? Ошибка, кажется, говорит, что здесь проблема. Не то, чтобы было бы разумно это сделать ... –

+0

Ну, теперь вы меня заинтересовали. Он работает, но только в том случае, если есть один результат, и было бы разумно, если бы кодовое обозначение было объединено с дикой карточной строкой. Я никогда не нуждался в этом раньше ... –

+0

Он возвращает пустой набор –

Смежные вопросы