我正在做一些关于自己学习的练习,我遇到了这个练习 在小组上。
http://studybyyourself.com/seminar/sql/exercises/7-1/?lang=en
我第一次弄错了(我用作者的名字写了一个WHERE声明)然后我检查了解决方案,它是
SELECT *
FROM Author AS a
INNER JOIN Writing AS w ON w.Author_id = a.ID
INNER JOIN Book AS b ON b.ID = w.Book_id
GROUP BY b.ID
HAVING COUNT(*) = 1 AND a.Last_Name = 'Duncan' AND a.First_name = 'Andrew'
所以我认为只要它们与HAVING语句中的聚合配对,放置条件非聚合语句就可以了,对吗?
答案 0 :(得分:2)
我想说在JOIN
子句中移动那些WHERE
条件以在分组发生之前应用过滤器,并且在HAVING
子句中只有分组或聚合过滤器,因为过滤条件在{{ 1}}子句适用于聚合结果,用于此目的
HAVING
答案 1 :(得分:1)
去别的地方学习SQL。该语句在语法和逻辑上都是错误的。
正确的解决方案看起来更像是这样:
SELECT . . .
FROM Author AS a INNER JOIN
Writing AS w
ON w.Author_id = a.ID INNER JOIN
Book AS b
ON b.ID = w.Book_id
GROUP BY b.ID
HAVING COUNT(*) = 1 AND
MAX(a.Last_Name) = 'Duncan' AND
MAX(a.First_name) = 'Andrew';
b
以外的表中的列应该(正确地说)也具有聚合函数。