有两个表:
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)
这可以在没有加入的情况下实现吗?如果是,怎么样?
答案 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);
没有加入
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表结合使用以获得所需的结果。