与 sql 中的查询混淆

Confusing with Having query in sql

我正在使用 sql server management studio 2012 并且必须查询以显示学生不及格的科目(不及格条件是分<5.0)第一次来自这个table

StudentID | SubjectID | First/Second_Time | Point.
 1        |   02      |         1         |   5.0 
 2        |   04      |         2         |   7.0
 3        |   03      |         2         |   9      
... etc

这是我老师的问题:

SELECT SubjectID
FROM Result(NAME OF the TABLE)
WHERE [First/Second_Time] = 1 AND Point < 5
GROUP BY SubjectID
HAVING count(point) >= ALL 
(
    SELECT count(point)
    FROM Result
    WHERE [First/Second_Time] = 1 AND point < 5
    GROUP BY SubjectID
) 

我不明白进行 having 查询的原因。因为 Count(point) 总是 >=all(select count(point) from Result where First/Second_Time=1 and point<5 group by SubjectID),不是吗? 而且这并不表明该科目有大多数学生第一次不及格。提前致谢,抱歉我的英语不好

子查询正在 return 列出主题失败的次数(第一次尝试时)。如果您 运行 像这样,您可能更容易看到它在做什么:

SELECT SubjectID, count(point)
    FROM Result
    WHERE [First/Second_Time] = 1 AND point < 5
    GROUP BY SubjectID

所以如果某人数学失败两次,科学失败一次,子查询将 return:

2
1

您想知道哪个主题失败次数最多(在这种情况下,哪个主题失败 2 次或更多次,因为这是子查询中失败次数最多的)。所以你再算一次(也按主题分组),并且使用having到return只有主题有2个或更多失败(大于或等于最高值)在你的子查询中)。

SELECT SubjectID
FROM Result
WHERE [First/Second_Time] = 1 AND Point < 5
GROUP BY SubjectID
HAVING count(point)...

有关更多示例,请参阅 https://msdn.microsoft.com/en-us/library/ms178543.aspx

听起来你正在为 class 做一个项目,所以我什至不确定我是否应该回答这个问题,但就这样吧。问题是为什么要有 having 子句。您是否阅读了 having and all 的说明?

全部"Compares a scalar value with a single-column set of values"。 这种情况下的标量值是计数(点)或点小于 5 的主题 ID 的出现次数。这种情况下的单列集是每个主题小于 5 的出现次数的列表点.

比较的最终结果在“>=”中。 "All" 只有在子查询中的每个值都为真时才会计算为真。子查询 returns 一组满足 <5 和第一次要求的所有主题的计数。如果你有3个subject满足<5和1st time的条件,他们的频率分别是1,2,3次,那么主查询就会有3个"having"的结果; 1,2,3。每个主查询结果必须 >= 该主值的每个子查询结果才能评估为真。因此,逐步进行,第一个主要值 1 >= 1,但不是 >= 2,因此 1 下降,因为 "having" 为假。第二个主要值 2 >=1,>=2,但不是 >=3,所以它会下降。第三个值 3 的计算结果为 >= 1、2 和 3,因此您最终会返回频率最高的主题。

这在 "All" 关键字的 MSDN 讨论的 "remarks" 部分相当清楚,但与您的特定应用程序无关。

记住,MSDN 是我们的朋友!