“每个 GROUP BY 表达式必须至少包含一列不是外部引用。”当 GROUP BY 包含常量时报告。为什么?

问题描述 投票:0回答:2

存在大量与“每个

GROUP BY
表达式必须包含至少一列不是外部引用”相关的问题。错误,并且在
GROUP BY
子句中包含常量值通常是导致错误的原因。
我实际上正在从数据库转换一些 SQL,该数据库允许在
GROUP BY
子句中使用常量,所以我想知道两件事:

  • 为什么 MS SQL Server 不允许在

    GROUP BY
    子句中使用常量?

  • 为什么在

    GROUP BY
    子句中放入常量会产生 this 错误,而不是“不要在
    GROUP BY
    子句中放入常量,白痴。”错误?

这是发生错误的一个简单示例。以下代码在第三个

SELECT
语句上崩溃,并显示不协调的错误消息。

DECLARE @demo TABLE
( groupCol1 int
, groupCol2 int);

INSERT INTO @demo VALUES(1,1);
INSERT INTO @demo VALUES(1,1);
INSERT INTO @demo VALUES(2,1);
INSERT INTO @demo VALUES(1,2);
INSERT INTO @demo VALUES(1,2);
INSERT INTO @demo VALUES(2,2);
INSERT INTO @demo VALUES(3,1);
INSERT INTO @demo VALUES(3,1);
INSERT INTO @demo VALUES(1,3);
INSERT INTO @demo VALUES(1,3);

SELECT * FROM @demo;
SELECT * FROM @demo GROUP BY groupCol1, groupCol2;
SELECT *, 'x' FROM @demo GROUP BY groupCol1, groupCol2, 'x';
sql-server group-by
2个回答
6
投票

产生该错误是因为查询包含逻辑错误。您有一个对于所有行都相等的

GROUP BY
表达式。因此,它将结果集分组没有意义。有些数据库系统更能容忍逻辑错误,并会尝试生成结果集。 SQL Server 不太容忍此类错误。它希望您认真思考并实际告诉它您想让它做什么

您可以在 T-SQL 中的许多地方包含常量值 - 但不能在它们不产生逻辑差异的地方包含。


0
投票

答案就是忽略常数;它们不必包含在 group by 子句中,因为它们在所有记录中都是相同的。:

将 @prevMonth 声明为 int set @prevMonth = MONTH(Getdate())-1 SELECT c.name, 2 as Report#, YEAR(Getdate()) as [Year], @prevMonth as MonthEnded ,c.agent_region,'agentaggregate' as ReportDesc , COUNT(c.cat_id) [计数猫]
来自agent_cat c 按姓名分组 --注意 group by 子句中的所有常量值都被忽略。这是 MS SQL

© www.soinside.com 2019 - 2024. All rights reserved.