【发布时间】:2011-08-20 16:12:45
【问题描述】:
我知道,如果您在 SELECT 语句中有一个聚合函数,那么语句中的所有其他值必须是聚合函数,或者列在 GROUP BY 子句中。我不明白为什么会这样。
如果我这样做:
SELECT Name, 'Jones' AS Surname FROM People
我明白了:
NAME SURNAME
Dave Jones
Susan Jones
Amy Jones
因此,DBMS 从每一行获取一个值,并在结果集中将一个值附加到它。没关系。但如果这行得通,我为什么不能这样做:
SELECT Name, COUNT(Name) AS Surname FROM People
这似乎是相同的想法,从每一行中获取一个值并附加一个值。但不是:
NAME SURNAME
Dave 3
Susan 3
Amy 3
我明白了:
您尝试执行的查询不包含指定表达式“ContactName”作为聚合函数的一部分。
我知道这是不允许的,但是这两种情况看起来如此相似,以至于我不明白为什么。是为了让 DBMS 更容易实现吗?如果有人能向我解释为什么它不像我认为的那样工作,我将非常感激。
【问题讨论】:
-
您认为
count(Name)在该查询中的含义是什么? -
一些 RDBM 系统(如 SQL-Server、Postgres)具有“窗口”功能,可以显示类似于您所寻求的结果。当您显式或隐式使用
GROUP BY时(通过在SELECT部分中使用聚合函数),您不能同时使用两者。 -
我也说看看
OVER ()子句中的PARTITION BY,它们在查询中往往看起来更接近,事情可能会开始点击到位。我有时希望 SQL 不那么结构化:)