SQl Live:显示列的最小值,加上同一表中的对应值,以及第二表中的相关值

时间:2018-10-08 17:44:46

标签: sql oracle

我有两个表DEPT和EMP。 EMP具有一个deptno列,该列与DEPT中的deptno列相对应。我需要在DEPT中显示每个部门的最早(最少)雇用日期(EMP中的另一列),dname(部门名称)和雇员的姓名(ename)

这是我到目前为止的代码,但是我不确定如何修改它以显示相应的员工姓名。

SELECT dname, MIN(hiredate) AS "Most Senior"

FROM dept, emp  
WHERE dept.deptno = emp.deptno  
GROUP BY dname

编辑以下是表格:

CREATE TABLE dept(   
  deptno     number(2,0),   
  dname      varchar2(14),   
  loc        varchar2(13),   
  CONSTRAINT pk_dept PRIMARY KEY (deptno)   
);

CREATE TABLE emp(

  empno    number(4,0),   
  ename    varchar2(10),   
  job      varchar2(9),   
  mgr      number(4,0),   
  hiredate date,   
  sal      number(7,2),   
  comm     number(7,2),   
  deptno   number(2,0),   
  CONSTRAINT pk_emp PRIMARY KEY (empno),   
  CONSTRAINT fk_deptno FOREIGN KEY (deptno) REFERENCES dept (deptno)   
);

4 个答案:

答案 0 :(得分:0)

尝试再添加一个比较雇用日期的条件。如果可以给出表结构,则一些示例数据将对回答更为有帮助。

SELECT 
  dname,
  e.ename,
  min(e.hiredate) as hire_date 
FROM 
  dept as d, emp e 
where 
  d.deptno = e.deptno 
group by 
  d.deptno
having
  e.hiredate = hire_date

答案 1 :(得分:0)

如果DBMS支持,则可以使用row_number()

SELECT x.hiredate,
       x.dname,
       x.ename
       FROM (SELECT e.hiredate,
                    d.dname,
                    e.ename,
                    row_number() OVER (PARTITION BY d.deptno
                                       ORDER BY e.hiredate) rn
                    FROM dept d
                         INNER JOIN emp e
                                    ON e.deptno = d.deptno) x
       WHERE x.rn = 1;

我还建议使用显式JOIN语法。

答案 2 :(得分:0)

您可以使用相关子查询:

select d.dname, d.*
from dept d join
     emp e
     on d.deptno = e.deptno
where e.hiredate = (select min(e2.hiredate) from emp e2 where e2.deptno = e.deptno);

您还可以使用row_number()rank()解决此问题。在许多数据库中,相关子查询通常具有更好的性能,尤其是在e(deptno, hiredate)上使用索引。

答案 3 :(得分:0)

为了不仅选择分钟(hire_date),而且要选择关联的员工,您将需要使用某种方法按部门内的hire_date对员工进行排名。最简单的方法是使用row_number函数。使用示例代码:

select dept.dname , emp.hiredate as "most_senior" , emp.ename as "senior_employee" from dept join (select * , row_number(PARTITION BY deptno ORDER BY hiredate) as rn from emp ) emp on dept.deptno = emp.deptno and emp.rn = 1 ;