【问题标题】:SQL query : select employees from each company having max salary,SQL查询:从每个公司中选择最高薪水的员工,
【发布时间】:2014-09-22 12:36:51
【问题描述】:

您好,我为 Derby 数据库编写了一个 SQL 查询,该查询从每个具有最高薪水的公司中获取一名员工

这些是表结构

 create table Company_Tbl_One(
    company_Id int primary key,
    company_name varchar(100)
 )

 create table Employee_Tbl_One(
    employee_Id int primary key,
    employee_name varchar(100),
    company int references Company_Tbl_One
 )

 alter table Employee_Tbl_One add salary int

 insert into Company_Tbl_One values(12,'Facebook Inc');
 insert into Company_Tbl_One values(11,'Google Inc');
 insert into Company_Tbl_One values(10,'Yahoo Inc');
 insert into Company_Tbl_One values(14,'AOL Inc');

 insert into EMPLOYEE_TBL_ONE(employee_Id,employee_name,company,salary) values(1, 'Tom Jackson',12,1000);
 insert into EMPLOYEE_TBL_ONE(employee_Id,employee_name,company,salary) values(2, 'Jimmy John',12,200);
 insert into EMPLOYEE_TBL_ONE(employee_Id,employee_name,company,salary) values(3, 'Samual Jackson',11,2000);
 insert into EMPLOYEE_TBL_ONE(employee_Id,employee_name,company,salary) values(4, 'Sam Raime',10,3000);
 insert into EMPLOYEE_TBL_ONE(employee_Id,employee_name,company,salary) values(5, 'Tidy Mann',14,5000);
 insert into EMPLOYEE_TBL_ONE(employee_Id,employee_name,company,salary) values(6, 'Oliver Stone',14,5300);
 insert into EMPLOYEE_TBL_ONE(employee_Id,employee_name,company,salary) values(7, 'Falcon Gonzalies',10,3300);
 insert into EMPLOYEE_TBL_ONE(employee_Id,employee_name,company,salary) values(8, 'Ister Jack',11,2300);

sql查询如下

select e.employee_name, c.company_name
from    EMPLOYEE_TBL_ONE e,
    COMPANY_TBL_ONE c,
    (select max(salary) as SALARY,
            company as COMPANY_ID 
            from EMPLOYEE_TBL_ONE group by COMPANY) x
where   c.company_Id = x.COMPANY_ID 
and     e.salary = x.SALARY
and     e.company = c.company_Id

现在上面的 sql 查询可以正常工作并获取我的结果,

但是对于同一个问题语句,还有其他的写sql查询的方法吗?

【问题讨论】:

  • 不相关但是:您应该开始在 FROM 子句中使用显式 JOINs 而不是在 where 子句中使用隐式连接。关于您的问题:由于 Derby 缺少窗口功能,我看不到另一种实现您想要的方法。
  • 为什么需要多种方式来编写查询?由于某种原因,您确定的那个是不够的吗?

标签: sql derby greatest-n-per-group


【解决方案1】:

使用not exists 的另一种方式,即选择不存在其他薪水更高的员工的所有员工

select e.employee_name, c.company_name, e.salary
from EMPLOYEE_TBL_ONE e
join COMPANY_TBL_ONE c on e.company = c.company_Id     
where not exists (
    select 1 from EMPLOYEE_TBL_ONE e2
    where e2.company = e.company
    and e2.salary > e.salary
)

【讨论】:

    【解决方案2】:

    可以使用SQL的函数RANK

    SELECT *
    FROM Company_Tbl_One C
    INNER JOIN 
    (
      SELECT *, RANK() OVER(PARTITION BY Company ORDER BY Salary DESC) AS rank
      FROM Employee_Tbl_One
    ) E
    ON C.company_Id = E.company
    AND E.rank = 1
    

    编辑:抱歉,以为是 MSSQL

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-14
      • 1970-01-01
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多