【发布时间】:2013-09-21 17:17:38
【问题描述】:
我有以下表格
CREATE TABLE Foos (
[Id] INT IDENTITY,
-- Other fields
)
CREATE TABLE Boos (
[Id] INT IDENTITY,
[FooId] INT,
-- Other fields
)
我正在尝试执行一个非常简单的查询:
SELECT f.Id, COUNT(*)
FROM Foos f
JOIN Boos b on f.Id = b.FooId
GROUP BY b.FooId
显然,由于GROUP BY,我收到了错误消息。错误信息是
选择列表中的列“Foo.Id”无效,因为它不是 包含在聚合函数或 GROUP BY 子句中。
当我将分组更改为 GROUP BY f.Id 时,一切都恢复正常了。
我的问题是,为什么 SQL Server 已经确定连接中的 f.Id = b.FooId、Foo.Id 在 IDENTITY 中是唯一的,并且分组将在逻辑上返回相同的计数,但为什么会抛出该错误由于主键上的连接?
【问题讨论】:
-
我很确定这只是准确实施并考虑所有情况的复杂性。 SQl-Server 更容易对其规则非常严格。如果列在功能上依赖于 group by 中的列,则 SQL 标准允许列在 select 中而不是 group by 或聚合中。 PostgreSQL 是最接近准确实现这一点的 DBMS,但它仍然没有完全实现标准(例如,您的查询失败,但如果您按 f.ID 分组,则可以包括 Foos 中的所有列 - sqlfiddle.com/#!12/b420c/3)
标签: sql sql-server select join group-by