SQL查询 - 部门和员工表,某些部门可能没有经理

时间:2014-09-06 15:42:39

标签: sql

有两个表:

Employee 
---------
emp_id
emp_name 
emp_contact 
salary 
mgr_emp_Id
Dept_No 

Dept 
-----
Dept_No
Dept_name
Dept_Location

编写SQL语句以列出所有部门名称以及位置和管理员名称(如果已将经理分配给部门)。请注意,有些部门仍然没有经理。 以下是否正确?

SELECT Dept_name, Dept_Location, emp_name AS Mgr_name 
FROM Dept 
LEFT JOIN Employee ON (Dept.Dept_No = Employee.Dept_No AND mgr_emp_id = emp_id)

这可以在没有加入的情况下实现吗?如果是,怎么样?

1 个答案:

答案 0 :(得分:0)

是的,你可以在没有JOIN的情况下实现这一点,即使我更喜欢使用JOIN。您的查询必须进行修改。这是怎么......

实施例

http://sqlfiddle.com/#!2/596b45/4(MySQL 5.5)

http://sqlfiddle.com/#!3/bbad4/1(SQL Server 2008)

http://sqlfiddle.com/#!12/bbad4/1(PostgreSQL 9.2)

假设

1)在员工表中:经理ID +部门ID将是唯一的

2)在员工表中:如果员工Clark是ID 5并且有一个ID为1的经理,那么表中将有一个ID为1的记录

3)正在使用MySQL 5.5

结构

create table dept
(
  dept_no int not null,
  dept_name varchar(100) not null,
  dept_location varchar(100) not null,
  primary key (dept_no)
);

create table employee 
(
  emp_id int not null,
  emp_name varchar(100) not null,
  mgr_emp_id int,
  dept_no int not null,
  primary key (emp_id),
  key employee_mgr_emp_id (mgr_emp_id),
  foreign key fk_employee_dept_dept_no (dept_no) references dept (dept_no) on delete no action on update no action
);

insert into dept values 
(1, 'Dept-1', 'Chicago'), 
(2, 'Dept-2', 'London');

insert into employee values 
(1, 'Clark Mgr', null, 1),
(2, 'Cameron Emp', 1, 1),
(3, 'Charlie Emp', 1, 1),
(4, 'Layton Emp', null, 2),
(5, 'Linda Emp', null, 2);

MySQL 5.5查询

没有加入

select 
  list.*,
  emp_id,
  emp_name
from employee, 
(
  select
    distinct 
    dept.dept_no, 
    dept.dept_name, 
    dept.dept_location, 
    employee.mgr_emp_id
  from dept, employee
  where 
    dept.dept_no = employee.dept_no
    and employee.mgr_emp_id is not null
) list
where
  employee.emp_id = list.mgr_emp_id;

使用JOIN (虽然与上述内容不完全相同。我更喜欢使用JOIN s)

select 
  list.*,
  emp_id,
  emp_name
from employee
inner join 
(
  select
    distinct 
    dept.dept_no, 
    dept.dept_name, 
    dept.dept_location, 
    employee.mgr_emp_id
  from dept
  left join employee on dept.dept_no = employee.dept_no
  where 
    employee.mgr_emp_id is not null
) list
on employee.emp_id = list.mgr_emp_id;

它是如何运作的

首先,我们希望获得employee表中管理员ID为not null的所有部门的列表。为此,我们在下面使用此查询。此查询将为芝加哥提供2条记录,因为员工表中有2条记录,其中包含芝加哥部门的有效经理ID。

没有加入

select
  dept.dept_no,
  dept.dept_name,
  dept.dept_location,
  employee.mgr_emp_id
from dept, employee
where
    dept.dept_no = employee.dept_no
    and employee.mgr_emp_id is not null;

加入

select
  dept.dept_no,
  dept.dept_name,
  dept.dept_location,
  employee.mgr_emp_id
from dept
left join employee on dept.dept_no = employee.dept_no
where
    employee.mgr_emp_id is not null;

要获得一条记录,我们将使用不同的关键字:

  select
    distinct 
    dept.dept_no, 
    ...

很好,所以现在我们知道每个部门的经理是谁。让我们找到这个人的名字。为此,我们将查询放在子查询中(我将其命名/别名为list),然后将其与employee表结合使用以获得所需的结果。