2013-08-03 127 views
1

这里的模式:SQL查询只返回一行

CREATE TABLE `employees` (
    `employee_id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `department_id` int(11) DEFAULT NULL, 
    `boss_id` int(11) DEFAULT NULL, 
    `name` varchar(255) DEFAULT NULL, 
    `salary` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`employee_id`) 
); 

CREATE TABLE `departments` (
    `department_id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`department_id`) 
); 

这里的数据集:

INSERT INTO `employees` (`employee_id`, `department_id`, `boss_id`, `name`, `salary`) 
VALUES 
    (1,1,0,'manager','80000'), 
    (2,1,1,'emp1','60000'), 
    (3,1,1,'emp2','50000'), 
    (4,1,1,'emp3','95000'), 
    (5,1,1,'emp4','75000'); 

INSERT INTO `departments` (`department_id`, `name`) 
VALUES 
    (1,'IT'), 
    (2,'HR'), 
    (3,'Sales'), 
    (4,'Marketing'); 

练习的问题:谁在他们的部门最大的工资表的员工。

这里是我的查询:

select e.name as 'employee name',max(e.salary) as 'salary',d.name as 'dept name' 
from employees e join departments d 
on e.department_id=d.department_id 
group by d.name 

为什么我的查询只返回一行?不应该返回4(每个部门名称)?

在此先感谢!

+3

所有员工都在部门1 ... –

回答

2

它做什么,你觉得它在做什么。问题是你的数据不是你想象的那样。 employees表中的所有条目的department_id是相同的,1。所以你每个部门得到一个价值,问题是只有一个部门被代表。

这里是一个SQLfiddle来说明这一点。我扩充了您的模式,但保持查询未修改。

+0

可能是一个愚蠢的问题:为什么只有一个部门代表? – kevl510

+0

呃......你告诉我?这是你的数据。 “只有一个部门有代表”,我在谈论你的“员工”表。在你的insert语句中,所有'department_id'都是'1'。这就是我所说的“只有一个部门有代表”。在您给我们的例子中,您没有来自其他部门的员工。当我添加它们时,其他部门就像您期望的那样出现在查询输出中。 –

+0

即使所有员工的employee_id都是1,是不是应该给我4行(因为我是按d.name分组的(并且有4个不同的名字)?再次感谢!!! – kevl510

0

inner join仅返回on条件匹配的行。由于只有一个部门有员工,只有该部门会被退回。

要选择所有部门,使用left join

select e.name as 'name of a random employee' 
,  max(e.salary) as 'max salary' 
,  d.name as 'dept name' 
from departments d 
left join 
     employees e 
on  e.department_id=d.department_id 
group by 
     d.name 

请注意,如果您使用的列由不是一个组(如e.name以上),你基本上得到一个随机值。它不会总是返回薪水最高的员工的姓名。

为了薪水最高回报员工的姓名,你可以:

select e.name as 'name of a employee with max salary' 
,  e.salary as 'max salary' 
,  d.name as 'dept name' 
from departments d 
left join 
     employees e 
on  e.department_id=d.department_id 
where e.name is null 
     or e.salary = 
     (
     select max(salary) 
     from employees e2 
     where e.department_id = e2.department_id 
     ) 
+0

仍然是查询是错误的。问题是:列出部门中薪水最高的员工,但您的查询不会返回员工姓名,只会返回max(薪水)。 – denied

0
SELECT 
d.name, 
e.name, 
e.salary 
FROM employees e 
INNER join departments d on e.department_id=d.department_id 
INNER JOIN (
    SELECT 
    d.department_id, 
    max(e.salary) as salary 
    from departments d 
    left join employees e on e.department_id=d.department_id 
    group by d.department_id 
) x ON x.salary = e.salary AND d.department_id = x.department_id 

该查询将返回每个部门中最高工资的员工列表。如果您想要查看多个部门的信息 - 只需填写更多员工的其他部门(根据您的陈述,只有部门中有员工,部门ID = 1)