#postgresql
#postgresql
Вопрос:
У меня есть три таблицы:
1) книга
Column Type | book_id | isbn | title | year |
book_id integer Auto Increment PK | 1 | 1234 | Book1 | 1999 |
isbn character varying(30) UNIQUE | 2 | 1235 | Book2 | 1999 |
title character varying(150) | 3 | 1236 | Book3 | 2009 |
year smallint
2) автор
Column Type | author_id | name |
author_id integer Auto Increment PK | 5 | Joe Doe |
name character varying(100) | 7 | John Curry |
| 9 | Jim Webb |
| 11 | Carl Lee |
3) book_author
Column Type | book_id | author_id |
book_id integer REFERENCES book(book_id) | 1 | 5 |
author_id integer REFERENCES author(author_id) | 1 | 7 |
PRIMARY KEY (book_id, author_id) | 2 | 9 |
| 3 | 11 |
У книги может быть один или несколько авторов, поэтому я решил создать таблицу book_author, чтобы соединить таблицы book и author вместе.
Я хочу создать запрос для выбора, например: названия книг и имен авторов всех книг, которые были написаны в 1999 году. Этот запрос должен возвращать что-то вроде:
title name
Book1 Joe Doe
Book1 John Curry
Book2 Jim Webb
Мне удалось создать два запроса, которые каким-то образом достигают этой цели (ну, не совсем).
SELECT name from author WHERE author_id =
ANY (SELECT author_id FROM book_author WHERE book_author.book_id = 1)
SELECT title FROM book WHERE book_id = ANY
(SELECT book_id FROM book_author WHERE author_id = 5 OR author_id = 7)
Можете ли вы предоставить мне один запрос, который достигает вышеупомянутой цели.
Было бы неплохо, если бы вы объяснили структуру запроса, обоснование, стоящее за ним.
Заранее благодарю вас
Ответ №1:
Вы можете считывать соединения между таблицами
Select b.title, a.name from book_author ba
join author a on (a.author_id =ba.author_id)
join book b on (ba.book_id = b.book_id)
where b.year=1999
Результат запроса :
title name
Book1 Joe Doe
Book1 John Curry
Book2 Jim Webb
Ответ №2:
Соедините таблицы, и вы сможете выбрать название книги и автора выберите book_author это исходная таблица, в которой содержатся данные транзакции, и объединитесь с таблицами поиска (book и author), чтобы получить информацию об этих транзакциях.
Select b.title,a.name from book_author as ba
inner join author as a on ba.author_id=a.author_id
Inner join book as b on b.book_id=ba.book_id