我有两个表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)
);
答案 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
;