我正在使用HR表架构,我有一个练习说明:
job_history
可以包含多个被雇用多次的员工的条目。创建查询以检索多次雇用的员工列表。包括列EMPLOYEE_ID
,LAST_NAME
,FIRST_NAME
和汇总"Times Hired"
。
到目前为止,我做了什么:
select e.employee_id, e.last_name, e.first_name,
count (start_date) as Times_Hired
from job_history jH, employees e
WHERE e.employee_id=jH.employee_id
group by e.employee_id, e.last_name, e.first_name;
现在,我的问题是:
job_history
和employees
?因为当我运行它时,它只显示一些员工。
答案 0 :(得分:2)
您可以(并且应该)使用显式ANSI JOIN语法重写查询以使其清晰:
SELECT employee_id, e.last_name, e.first_name,
count (*) AS Times_Hired
FROM employees e
JOIN job_history j USING (employee_id)
GROUP BY employee_id, e.last_name, e.first_name
HAVING count (*) > 1;
我还使用 LEFT [OUTER] JOIN
将结果中的员工包括在job_history
(还)中没有任何行。
这是不相关的,因为您只对员工感兴趣..
比不止一次雇用
我用HAVING count (*) > 1
实现了这个条件。
至于你的第二个问题:很明显,employee_id
是......
连接表
job_history
和employees
?
由于我们加入的列名(employee_id
)在两个表格中都相同,我简化为equi-join with USING
。
我使用count(*)
代替count (start_date)
,因为尚未声明start_date
是否NULL
,在这种情况下它不会添加到计数中
关于你的第一个问题:不,你不需要这里的子查询。
JOIN
ON
语法
SELECT e.employee_id, e.last_name, e.first_name,
count (*) AS Times_Hired
FROM employees e
JOIN job_history j ON j.employee_id = e.employee_id
GROUP BY e.employee_id, e.last_name, e.first_name
HAVING count (*) > 1;
在SQLfiddle中进行了测试。