我们可以不使用子查询来编写此查询吗?
select * from test where EmpTran in
(select max(EmpTran) from test);
我尝试了此代码,但返回空集。 我读到,“在没有分组依据的情况下,整个数据被视为一个分组”,如果是这种情况,查询应返回与上述查询相同的结果。
select EmpTran,EmpName from test
having EmpTran = max(EmpTran);
样本数据:
create table test(EmpName varchar(10),EmpTrans int);
insert into test values('Ans',100);
insert into test values('Sam',50);
insert into test values('Kar',150);
insert into test values('Sar',200);
insert into test values('Raj',200);
答案 0 :(得分:2)
第二个查询不起作用,因为一旦您在查询中的任何地方使用了聚合函数,就会导致行被聚合。由于您没有GROUP BY
,因此所有内容都汇总到结果集中的一行中(就像您引用的那样:在没有分组依据的情况下,整个数据都被视为一个分组 )。在此结果集中,EmpTran
和EmpName
来自表中的任意行(它们甚至可能不是来自同一行)。
HAVING
然后过滤该结果集。如果所选的EmpTran
值与MAX(EmpTran)
不匹配,则从结果集中删除该行,您将得到一个空结果。
处理顺序为:
WHERE
选择要放入结果集中的行。HAVING
过滤聚合结果集。我认为在MySQL 5.x中没有子查询就没有办法做到这一点。在MySQL 8.x中,您可以使用窗口函数来完成此操作(我不熟悉这些功能,因此我不会在答案中显示它)。
答案 1 :(得分:1)
正如Barmar所解释的那样,您的第二个查询将不起作用,因为查找列的最大值需要一个正式的单独子查询。对于早于8+的MySQL版本就是这种情况。从引入了窗口函数的MySQL 8+开始,我们可以尝试这样的事情:
SELECT *
FROM
(
SELECT *, MAX(EmpTran) OVER () max_val
FROM test
) t
WHERE EmpTran = max_val;
该演示位于SQL Server中,因为Rextester尚不支持MySQL 8+。但是,它应该在实现了ANSI窗口功能标准的任何数据库上运行。