2013-08-03 128 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)