具有聚合和条件语句的SQL

时间:2017-01-06 18:52:49

标签: sql

我正在做一些关于自己学习的练习,我遇到了这个练习 在小组上。

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语句中的聚合配对,放置条件非聚合语句就可以了,对吗?

2 个答案:

答案 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以外的表中的列应该(正确地说)也具有聚合函数。