Sql 用WHERE替换have

Sql 用WHERE替换have,sql,oracle,where,having,Sql,Oracle,Where,Having,有三个团队A、B、C,其中一些没有成员 首先使用按小组从分数组中选择max(求和(数学))我获得了数学的最大求和 现在使用整个查询,我试图显示在数学上获得最高总和的团队 如何重写查询,以便将HAVING替换为WHERE可以将HAVING替换为WHERE,但这样做没有任何好处 SELECT team, sum(maths) FROM marks GROUP BY team HAVING sum(maths) = ( SELECT max(sum(maths)) FROM marks

有三个团队A、B、C,其中一些没有成员

首先使用
按小组从分数组中选择max(求和(数学))
我获得了数学的最大求和

现在使用整个查询,我试图显示在数学上获得最高总和的团队


如何重写查询,以便将
HAVING
替换为
WHERE

可以将HAVING替换为WHERE,但这样做没有任何好处

SELECT team, sum(maths)
FROM marks
GROUP BY team
HAVING sum(maths) = (
    SELECT max(sum(maths))
    FROM marks
    GROUP BY team
)

可以用WHERE替换have,但这样做没有好处

SELECT team, sum(maths)
FROM marks
GROUP BY team
HAVING sum(maths) = (
    SELECT max(sum(maths))
    FROM marks
    GROUP BY team
)
请尝试:

select team, sum(maths) from
(
   SELECT team, sum(maths) as total
   FROM marks
   GROUP BY team
) t1
where t1.total = ( select max(t1.total) from t1 )
请尝试:

select team, sum(maths) from
(
   SELECT team, sum(maths) as total
   FROM marks
   GROUP BY team
) t1
where t1.total = ( select max(t1.total) from t1 )

如果您对结果进行排序,您可以使用以下命令将其包装在外部
选择
,将其限制在第一行:

或者,您也可以在外部选择中使用换行:

SELECT *
FROM (
    SELECT team, sum(maths)
    FROM marks
    GROUP BY team
    ORDER BY sum(maths) DESC
)
WHERE ROWNUM = 1;

如果您对结果进行排序,您可以使用以下命令将其包装在外部
选择
,将其限制在第一行:

或者,您也可以在外部选择中使用换行:

SELECT *
FROM (
    SELECT team, sum(maths)
    FROM marks
    GROUP BY team
    ORDER BY sum(maths) DESC
)
WHERE ROWNUM = 1;

它并不比其他方法更有效,但如果您只需要多种方法,您可以尝试这种方法

SELECT *
FROM (
    SELECT team, sum(maths),
        ROW_NUMBER() OVER (PARTITION BY team ORDER BY sum(maths) DESC) AS rn
    FROM marks
    GROUP BY team
)
WHERE rn = 1;

它并不比其他方法更有效,但如果您只需要多种方法,您可以尝试这种方法

SELECT *
FROM (
    SELECT team, sum(maths),
        ROW_NUMBER() OVER (PARTITION BY team ORDER BY sum(maths) DESC) AS rn
    FROM marks
    GROUP BY team
)
WHERE rn = 1;

使用公共表表达式的另一种方法:

SELECT DISTINCT FIRST_VALUE(TEAM) OVER(ORDER BY SUM(MATHS) DESC),
          FIRST_VALUE(SUM(MATHS)) OVER(ORDER BY SUM(MATHS) DESC)
FROM MARKS
GROUP BY TEAM
对于非常多的团队来说,它会表现得很好,因为优化者可以将团队总和公共表表达式的结果集具体化,并对其执行max()


它还列出了共享相同总分的多个团队。

另一种方法,使用通用表表达式:

SELECT DISTINCT FIRST_VALUE(TEAM) OVER(ORDER BY SUM(MATHS) DESC),
          FIRST_VALUE(SUM(MATHS)) OVER(ORDER BY SUM(MATHS) DESC)
FROM MARKS
GROUP BY TEAM
对于非常多的团队来说,它会表现得很好,因为优化者可以将团队总和公共表表达式的结果集具体化,并对其执行max()


它还列出了多个共享相同总分的团队。

您使用的是什么
RDBMS
代表关系数据库管理系统
RDBMS是SQL的基础,也是所有现代数据库系统(如MS SQL Server、IBM DB2、Oracle、MySQL等)使用Oracle的基础。。你为什么问这个问题?您的查询正确且清晰。为什么要使用
WHERE
?事实上,您的查询将返回您预期的结果。寻找多种方法来实现同一查询,看看哪种方法对我来说是最好的。此外,它还提高了对问题的理解程度您正在使用什么
RDBMS
代表关系数据库管理系统
RDBMS是SQL的基础,也是所有现代数据库系统(如MS SQL Server、IBM DB2、Oracle、MySQL等)使用Oracle的基础。。你为什么问这个问题?您的查询正确且清晰。为什么要使用
WHERE
?事实上,您的查询将返回您预期的结果。寻找多种方法来实现同一查询,看看哪种方法对我来说是最好的。此外,它还提高了对queries@techdo-OP想要的是得分最高的团队,而不仅仅是得分值。@techdo-OP想要的是得分最高的团队,而不仅仅是得分值。