子查询并在sql

时间:2018-08-09 04:25:03

标签: mysql

我们可以不使用子查询来编写此查询吗?

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);

2 个答案:

答案 0 :(得分:2)

第二个查询不起作用,因为一旦您在查询中的任何地方使用了聚合函数,就会导致行被聚合。由于您没有GROUP BY,因此所有内容都汇总到结果集中的一行中(就像您引用的那样:在没有分组依据的情况下,整个数据都被视为一个分组 )。在此结果集中,EmpTranEmpName来自表中的任意行(它们甚至可能不是来自同一行)。

HAVING然后过滤该结果集。如果所选的EmpTran值与MAX(EmpTran)不匹配,则从结果集中删除该行,您将得到一个空结果。

处理顺序为:

  1. 使用WHERE选择要放入结果集中的行。
  2. 必要时汇总结果集。
  3. 使用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;

Demo

该演示位于SQL Server中,因为Rextester尚不支持MySQL 8+。但是,它应该在实现了ANSI窗口功能标准的任何数据库上运行。

相关问题