SELECT
MemberFirstName, MemberLastName, COUNT(*) AS TotalBookOnLoan
FROM
Member
JOIN
Loan ON Member.MemberID= Loan.MemberID
WHERE
LoanDate IS NOT NULL
GROUP BY
Member.MemberFirstName
ORDER BY
MemberFirstName ASC
为什么这个查询是错误的?
我在您的查询中发现了三个主要缺陷:
首先,您仅按名字进行聚合,然后选择名字和姓氏。在大多数数据库上,这样的代码甚至无法运行。即使在可以容忍这种语法的数据库上,这种行为也可能不是您想要的。解决方法是按名字和姓氏进行聚合。
您正在使用
COUNT(*)
进行计数。但问题是,会员没有任何借阅书籍,会错误地显示为拥有一本借阅书籍。要解决此问题,您应该使用 COUNT(Loan.MemberId)
进行计数。如果会员没有借阅书籍,则此计数表达式将正确返回零。
内连接应更改为左连接,贷款日期条件是连接条件的一部分。
将所有这些修复放入,我们可以尝试编写:
SELECT m.MemberFirstName, m.MemberLastName, COUNT(l.MemberID) AS TotalBookOnLoan
FROM Member m
LEFT JOIN Loan l
ON m.MemberID = l.MemberID AND
l.LoanDate IS NOT NULL
GROUP BY m.MemberFirstName, m.MemberLastName
ORDER BY m.MemberLastName, m.MemberFirstName;