在 mysql 中不允许使用 FETCH 子句。改用啥替代方法

Posted

技术标签:

【中文标题】在 mysql 中不允许使用 FETCH 子句。改用啥替代方法【英文标题】:using FETCH clause is not allowed in mysql .what alternative to be used instead在 mysql 中不允许使用 FETCH 子句。改用什么替代方法 【发布时间】:2021-12-20 06:41:37 【问题描述】:

您好,我有 2 个表想要使用聚合并具有线索。你能检查我的查询吗?不工作

SELECT
    registration.Staff_ID,
    staff.FirstName,
    staff.LastName,
    (sum(registration.RegFeeAmntPaid)) AS The_Best_Seller
FROM registration,staff
WHERE registration.Staff_ID = staff.Staff_ID
GROUP BY Staff_ID
HAVING MAX(SUM(registration.RegFeeAmntPaid)) = SUM(registration.RegFeeAmntPaid);

【问题讨论】:

你不能这样嵌套聚合。 这必须是两个设置:获取每个员工的总和。然后得到最大人员总和并进行比较。您正在尝试将这两个步骤合二为一。窗口函数将对此有所帮助。您使用的是什么 DBMS? (SQL 请求应始终使用 DBMS 进行标记,以免得到不适合您的答案。) 我已经为你添加了 mysql 标签。在标准 SQL 中,您可以将 HAVING 子句替换为 ORDER BY RANK() OVER (ORDER BY SUM(registration.RegFeeAmntPaid) DESC) FETCH FIRST ROW WITH TIES,但 MySQL 不支持 FETCH 子句。从 MySQL 8 开始,您可以使用 RANK OVERMAX OVER,但您需要一个子查询来评估结果。 【参考方案1】:

嵌套聚合MAX(SUM(registration.RegFeeAmntPaid)) 问题是:SQL中不允许嵌套聚合:第一次聚合后,只有一个值。因此,再次聚合没有意义。 (在 Oracle 中,在 GROUP BY 查询的 SELECT 下,可以使用嵌套聚合来获取单个值,但这不是标准的。)

此外,在大多数系统中,在没有聚合的 SELECT 下打印的属性必须出现在 GROUP BY 下。 (在标准 SQL 和 PostgreSQL 中,由 GROUP BY 属性在功能上确定的属性是可以的。但例如在 Oracle 中,它们必须在 GROUP BY 下明确提及,即使这实际上不会更改组。)

此外,在 GROUP BY 子句中,Staff_ID 缺少表/元组变量名(不清楚,您是指registration.Staff_ID 还是staff.Staff_ID。我知道这无关紧要,但SQL 系统会不知道。)

有几种解决方案可以使总和最大化。一个是这样的:

SELECT
    registration.Staff_ID,
    staff.FirstName,
    staff.LastName,
    (sum(registration.RegFeeAmntPaid)) AS The_Best_Seller
FROM registration,staff
WHERE registration.Staff_ID = staff.Staff_ID
GROUP BY registration.Staff_ID,
         staff.FirstName, staff.LastName
HAVING SUM(registration.RegFeeAmntPaid) >= ALL
    (SELECT SUM(s.RegFeeAmntPaid)
     FROM   registration s
     GROUP BY s.staff_id)

另一种解决方案是使用 WITH 子句定义一个包含每个 staff_id 总和的辅助表。然后你可以使用 MAX 函数。这在没有 WITH 子句的情况下也是可能的,但是需要在 FROM 下进行子查询(这也给出了一个中间表)。必须将这两个聚合放在不同的 SELECT 子句中。

【讨论】:

这很好解释。可能有更好的方法,但这取决于 DBMS。 @eli:你用的是哪个? @ThorstenKettner ,谢谢我通过 localhost 使用 mysql、phpmyadmin、xamp

以上是关于在 mysql 中不允许使用 FETCH 子句。改用啥替代方法的主要内容,如果未能解决你的问题,请参考以下文章

在 90 或更高版本的兼容模式下,ORDER BY 子句中不允许使用常量表达式

子查询中不允许用order by子句,那么应该怎么办?

Oracle Fetch(限制行数)子句

Oracle Fetch(限制行数)子句

MySQL - 在 WHERE 子句中使用 COUNT(*)

Mysql数据表字段的增,改,删