【问题标题】:SQL JOIN two table in tricky waySQL JOIN 以棘手的方式连接两个表
【发布时间】:2021-02-07 12:42:20
【问题描述】:

卡在编写棘手的SQL 请求中。 这里有两张表:BookPage。每个Book 有多个Pages 的内容。 以下 SQL 请求:

SELECT book.id as "book Id",
       book.date as "Date",
       book.description as "Description",
       page.description as "Page Description",
       page.content as "Page Content"
    FROM book JOIN page
        ON book.id = page.book_id
            WHERE book.id=9

用相对SQL-Alchemy查询:

query = db.session.query(
    Book.id.label("book Id"),
    Book.date.label("Date"),
    Book.description.label("Description"),
    Page.description.label("Page Description"),
).join(Page, Book.id == Page.book_id)\
    .filter(Book.id == 9)

给我以下:

但我需要以下结果:

我可以建立这样的查询吗?因此,我需要在端点请求上发送json,其中包含具有页面对象列表的书籍对象列表。

【问题讨论】:

  • 如果您最终想要生成嵌套的 JSON,那么您最好创建一个返回 ORM 对象列表的查询,然后遍历该列表以生成 JSON。

标签: sql join sqlalchemy


【解决方案1】:

虽然我不清楚book_id in (52, 53) 各个页面从哪里有两个空行,但我认为page 表中有book_id in (52, 53) 的记录在描述字段中有NULL 值。 不管怎样,这个查询应该会有所帮助:

SELECT 
    book_id
  , Date
  , Description
FROM
    (
    SELECT 
          b.id AS book_Id
        , b.date AS Date
        , COALESCE(b.description, '') AS Description
        , 1 as order_col
    FROM book as b

    UNION ALL

    SELECT 
          NULL AS book_Id
        , NULL AS Date
        , p.description AS Description
        , b.id as order_col
    FROM book AS b
    INNER JOIN page AS p ON b.id = p.book_id
    ) AS X
ORDER BY coalesce(book_id, order_col) ASC, order_col ASC

所以,首先,您从book 表中获取与书籍相关的行,然后将其与page 表中的相应页面的信息联合起来,您将book 表字段视为NULL-s。 棘手的部分是这里的顺序,给定的逻辑在这种情况下肯定会起作用,但是,您可能需要根据数据进行调整。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 2021-12-26
    • 2020-04-19
    • 1970-01-01
    • 2011-07-28
    相关资源
    最近更新 更多