代码1:

select DepartmentId 
from Employee
group by DepartmentId
having Salary=max(Salary);

报错:

Unknown column 'XXXX' in 'having clause

原因:

表根据Department将表的数进行分组,在执行Salary=max(Salary)这一句时,max(Salary)选出每一组最大的Salary,但是等号左边的Salary,并不知道指定的是哪一行的数据,因此会报错。

代码2:

select d.Name as Department,Employee.Name as Employee,Employee.Salary
from Department as d,Employee
where d.Id=Employee.DepartmentId 
      and 
      d.Id in 
           (select Employee.DepartmentId 
            from Employee
            group by DepartmentId
            having Salary = max(Salary));

在执行上面的子查询时,同样是 Salary = max(Salary),却可以执行成功。是因为虽然没有指定,但是这里的Salary是指的外层查询传进来的数据。根据SQL语句的执行顺序,上面的代码,先执行from语句,分别从Department表和Employee表中选出一条数据,传递进入子查询中。having子句中,虽然没有指定Salary来自哪里,这里应该默认是指传进来的数据。代码改成下面的样子应该更好理解一点。

代码3:

select d.Name as Department,e.Name as Employee,e.Salary
from Department as d,Employee as e
     where d.Id=e.DepartmentId 
           and d.Id in (select Employee.DepartmentId 
                        from Employee
                        group by DepartmentId
                        having e.Salary = max(Salary));

两者的代码执行结果是相同的,但代码3更能直观的看出,每条数据来自哪里。 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐