Вложенный запрос ВЫБОРА в postgresql

#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