【问题标题】:Nested SELECT query in postgresqlpostgresql 中的嵌套 SELECT 查询
【发布时间】:2019-08-08 23:33:05
【问题描述】:

我有三张桌子:

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 表来将书和作者表连接在一起。 我想创建一个查询以选择例如: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)

您能否向我提供一个可以达到上述目的的查询。 如果您解释查询的结构及其背后的原因,那就太好了。 提前谢谢你

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    你可以读出Joins Between Tables

    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 这是包含交易数据的源表,并与查找表(书籍和作者)连接以获取有关这些交易的信息。

       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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-16
        • 2017-11-29
        • 1970-01-01
        • 2016-03-22
        • 1970-01-01
        • 2012-09-13
        • 1970-01-01
        相关资源
        最近更新 更多