MySQL - 在多列

时间:2017-01-12 12:06:48

标签: mysql sql

我需要一个显示以下行的查询:

first_name   last_name     dept_no  hire_date   from_date
----------------------------------------------------------
Jianwen       Schiper       d004    1986-10-17  1986-10-17
Sanjiv        Zschoche      d004    1986-10-17  1986-10-17
Moty          Winter        d004    1991-04-28  1991-04-28
Zhilian       Ranst         d004    1991-04-28  1991-04-28
Jaewoo        Yoshimura     d004    1991-04-28  1991-04-28
Herbert       Zizka         d005    1985-03-21  1985-03-21
Arno          Luke          d005    1985-03-21  1985-03-21
Muzhong       Shokrollahi   d007    1985-09-05  1985-09-05
Isaac         Bael          d007    1985-09-05  1985-09-05
Mani          Cannata       d007    1989-06-21  1989-06-21
Lidong        Tomescu       d007    1989-06-21  1989-06-21
Taizo         Kitsuregawa   d007    1991-09-03  1991-09-03
Bodo          Tagansky      d007    1991-09-03  1991-09-03

简而言之,我需要同一个部门雇用的员工。 以下查询为我提供了员工的第一个部门和雇用日期:

select first_name, last_name, dept_no, hire_date, from_date
from employees join dept_emp using(emp_no)
where hire_date = from_date 
order by hire_date, dept_no

我需要将同一天雇佣的人分开到同一个部门。我尝试了太多查询,但我无法得到我需要的东西。 在此先感谢您的帮助,并对不良的英语表示抱歉。

2 个答案:

答案 0 :(得分:0)

如果您只想看到员工一起受雇,那么您可以订购结果:

select first_name, last_name, dept_no, hire_date, from_date
from employees join
     dept_emp
     using (emp_no)
order by dept_no, hire_date;

如果您想要雇用至少两名员工的日期(以及该日期的员工):

select first_name, last_name, dept_no, hire_date, from_date
from employees e join
     dept_emp d
     using (emp_no)
where exists (select 1
              from employees e2
              where e2.dept_no = e.dept_no and
                    e2.hire_date = e.hire_date and
                    e2.emp_no <> e.emp_no
             )
order by dept_no, hire_date;

答案 1 :(得分:0)

所以这是关于雇员和他们当时雇用的部门的初次招聘。对于这种情况,您假设dept_emp.from_date等于employees.hire_date

不幸的是,使用MySQL,您必须编写两次相同的查询,一次作为主查询,一次作为子查询(在其他DBMS中只使用count(*) over ())。

这是如何让员工拥有第一个部门:

select *
from employees e
join dept_emp de on de.emp_no = e.emp_no and de.from_date = e.hire_date

这是如何找到包含多个条目的第一部门/从最新组合:

select de.dept_no, de.from_date
from employees e
join dept_emp de on de.emp_no = e.emp_no and de.from_date = e.hire_date
group by de.dept_no, de.from_date
having count(*) > 1

这是两个组合:

select e.first_name, e.last_name, de.dept_no, e.hire_date, de.from_date
from employees e
join dept_emp de on de.emp_no = e.emp_no and de.from_date = e.hire_date
where (de.dept_no, de.from_date) in
(
  select de.dept_no, de.from_date
  from employees e
  join dept_emp de on de.emp_no = e.emp_no and de.from_date = e.hire_date
  group by de.dept_no, de.from_date
  having count(*) > 1
)
order by de.dept_no, e.hire_date