三重连接问题产生所需输出



我是一名学生,在SQL查询中工作,根据返回日期列值为NULL来生成未返回的图书,但是输出需要我连接3个表。结果是不正确的,我尝试了许多组合的GROUP BY和附加的WHERE条件。

这是我的问题提示:

写一个查询找出哪些副本还没有返回。输出应该显示图书的标题,借款人的姓名,copy_id,借款人的电话,借款人的电子邮件。此外,还应按排序借款人的名字。(提示:loan_date_returned为null)

ER图我的代码如下:

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个结果是预期的,然而,似乎我得到的是重复和结果,许多借阅者几乎借了所有的书,这是错误的。

很好,您的查询是CLOSE。你没有任何关于借阅如何与书相关联的条件。

此外,您正在使用旧的ANSI-SQL而不是使用正确的JOIN语法编写。可以将FROM子句视为定义查询中使用的所有表(及其别名)以及它们之间的关系(通常是ID键连接它们)的部分。在"借到账"的情况下,我假设有一些"账"。这是借给实际的书。

正如你可以看到的缩进,我写我的查询,你可以看到表1是如何连接到下一个表通过其紧接的"ON"条款。在什么条件下连接tableX和tableley。由于给定的借阅条目既与图书关联,又与借阅者关联,因此可以看到借阅者的缩进处于同一级别,但具有与其相关的连接"on"。紧接其后的条件。我总是先写左边的表=右边的表。我认为这有助于了解从第一个字段到第二个字段的匹配情况。

您的WHERE子句基于返回的贷款日期为空的唯一条件是ok的。

至于ORDER BY,我曾见过这样的情况,如果您尝试按未在所选列的结果集中的某些列排序,引擎会唠叨您,所以我只是将名称的concat()复制到ORDER BY子句中。

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)

最新更新