产生所需输出的三重连接问题
triple join issues in producing desired outputs
我是一名学生,正在研究 SQL 查询以根据 return 日期列值为 NULL 生成未returned 的书籍,但是输出要求我加入 3 table秒。得到的结果不正确,我尝试了很多GROUP BY和附加WHERE条件的组合。
这是我的问题提示:
Write a query to find out what copies have not been returned yet. The output should display book’s title,
borrower’s name, copy_id, borrower’s phone, and borrower’s email. In addition, it should also be sorted by
borrower’s name.(Hint: loan_date_returned is null)
ER Diagram
我的代码如下:
SELECT BK.book_title AS "Title", CONCAT(BRW.borrower_fname, ' ' ,BRW.borrower_lname) AS "Name", L.copy_id AS "Copy ID", BRW.borrower_phone AS "Phone", BRW.borrower_email AS "Email"
FROM loan AS L, book AS BK, borrower AS BRW
WHERE BRW.borrower_id = L.borrower_id AND L.loan_date_returned IS NULL
ORDER BY BRW.borrower_fname, BRW.borrower_lname
我从视觉上推断,从借阅的 20 条条目中预计只有 6 个结果 table,但是,我似乎收到了重复和结果,其中许多借款人几乎借走了所有的书,这是错误。
辛苦了,您的查询已关闭。您没有任何关于贷款与书籍关联的条件。
此外,您使用的是旧 ANSI-SQL 而不是使用正确的 JOIN 语法。将 FROM 子句视为定义将在查询中使用的所有 table(及其别名)以及它们如何相关(通常是您的 ID 键加入它们)的部分。在借书的情况下,我假设有一些借给实际书的“BookID”。那个不见了。
正如您在我编写查询时通过缩进看到的那样,您可以看到 table 1 如何通过其紧随其后的“ON”子句连接到下一个 table。在 WhatCondition 上加入 tableX 到 tableY。由于给定的借出项目与书籍以及借阅者相关联,因此您可以看到借阅者的缩进处于同一级别,但紧随其后的是 IT 相关连接“ON”条件。我也总是先写 left-side table = 右边 table。我认为这有助于了解从第一个字段到第二个字段的匹配方式。
根据 sole-condition 返回的贷款日期为空,您的 WHERE 子句是正确的。
至于 ORDER BY,我曾见过多次如果您尝试按某个不在所选列的结果集中的列进行排序,引擎会提醒您,所以我只是复制了名称的 concat() into order by clause.
SELECT
BK.book_title Title,
CONCAT(BRW.borrower_fname, ' ' , BRW.borrower_lname) Name,
L.copy_id AS "Copy ID",
BRW.borrower_phone Phone,
BRW.borrower_email Email
FROM
loan L
JOIN Copies C
on L.copy_id = C.Copy_id
JOIN book BK
ON C.Book_ID = BK.Book_ID
JOIN borrower BRW
ON L.borrower_id = BRW.borrower_id
WHERE
L.loan_date_returned IS NULL
ORDER BY
CONCAT(BRW.borrower_fname, ' ' , BRW.borrower_lname)
我是一名学生,正在研究 SQL 查询以根据 return 日期列值为 NULL 生成未returned 的书籍,但是输出要求我加入 3 table秒。得到的结果不正确,我尝试了很多GROUP BY和附加WHERE条件的组合。
这是我的问题提示:
Write a query to find out what copies have not been returned yet. The output should display book’s title, borrower’s name, copy_id, borrower’s phone, and borrower’s email. In addition, it should also be sorted by borrower’s name.(Hint: loan_date_returned is null)
ER Diagram
我的代码如下:
SELECT BK.book_title AS "Title", CONCAT(BRW.borrower_fname, ' ' ,BRW.borrower_lname) AS "Name", L.copy_id AS "Copy ID", BRW.borrower_phone AS "Phone", BRW.borrower_email AS "Email"
FROM loan AS L, book AS BK, borrower AS BRW
WHERE BRW.borrower_id = L.borrower_id AND L.loan_date_returned IS NULL
ORDER BY BRW.borrower_fname, BRW.borrower_lname
我从视觉上推断,从借阅的 20 条条目中预计只有 6 个结果 table,但是,我似乎收到了重复和结果,其中许多借款人几乎借走了所有的书,这是错误。
辛苦了,您的查询已关闭。您没有任何关于贷款与书籍关联的条件。
此外,您使用的是旧 ANSI-SQL 而不是使用正确的 JOIN 语法。将 FROM 子句视为定义将在查询中使用的所有 table(及其别名)以及它们如何相关(通常是您的 ID 键加入它们)的部分。在借书的情况下,我假设有一些借给实际书的“BookID”。那个不见了。
正如您在我编写查询时通过缩进看到的那样,您可以看到 table 1 如何通过其紧随其后的“ON”子句连接到下一个 table。在 WhatCondition 上加入 tableX 到 tableY。由于给定的借出项目与书籍以及借阅者相关联,因此您可以看到借阅者的缩进处于同一级别,但紧随其后的是 IT 相关连接“ON”条件。我也总是先写 left-side table = 右边 table。我认为这有助于了解从第一个字段到第二个字段的匹配方式。
根据 sole-condition 返回的贷款日期为空,您的 WHERE 子句是正确的。
至于 ORDER BY,我曾见过多次如果您尝试按某个不在所选列的结果集中的列进行排序,引擎会提醒您,所以我只是复制了名称的 concat() into order by clause.
SELECT
BK.book_title Title,
CONCAT(BRW.borrower_fname, ' ' , BRW.borrower_lname) Name,
L.copy_id AS "Copy ID",
BRW.borrower_phone Phone,
BRW.borrower_email Email
FROM
loan L
JOIN Copies C
on L.copy_id = C.Copy_id
JOIN book BK
ON C.Book_ID = BK.Book_ID
JOIN borrower BRW
ON L.borrower_id = BRW.borrower_id
WHERE
L.loan_date_returned IS NULL
ORDER BY
CONCAT(BRW.borrower_fname, ' ' , BRW.borrower_lname)