1

我正在使用 HR 表模式,其中有一个练习说明:

对于job_history多次雇用的员工,可以包含多个条目。创建一个查询以检索多次雇用的员工列表。包括列EMPLOYEE_IDLAST_NAMEFIRST_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_historyemployees

因为当我运行它时,它只显示几个员工。

4

1 回答 1

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;

我还使用 aLEFT [OUTER] JOIN在结果中包含job_history(还)没有任何行的员工。
这无关紧要,因为您只对员工感兴趣..

比被雇用不止一次

我用HAVING count (*) > 1.

至于你的第二个问题:显然,employee_id是 ..

连接表job_historyemployees

由于我们在 () 上加入的列名employee_id在两个表中都是相同的,因此我将其简化为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中进行了测试。

于 2013-03-17T14:54:28.883 回答