【问题标题】:subquery exercise子查询练习
【发布时间】:2013-03-07 01:26:18
【问题描述】:

我需要编写一个包含子查询的查询,其中将列出部门的名称以及每个部门在其 job_title 中具有“代表”一词的员工人数,并且该列表必须按部门 ID 排序。

我已经写了这个查询

SELECT d.department_name, emp.employee_id
FROM departments d, employees emp, jobs j
WHERE emp.department_id=d.department_id
AND j.job_title LIKE '%Representative%';

【问题讨论】:

  • 除了子查询之外,您还缺少一些逻辑。 jobsdepartmentsemployees 有什么关系?
  • 请在您的架构和记录中使用 sqlfiddle。让我们知道预期的输出。
  • 我会将关于职位的部分像代表一样移动到子查询中。
  • 想必您会在所有问题得到回答后删除所有问题的详细信息,以使教授无法通过 Google 搜索您找到它们的位置?

标签: sql oracle11g


【解决方案1】:

如果需要使用子查询,那么以下将实现您正在寻找的内容:

select   d.department_id,
         d.department_name,
         (select count(*)
          from   employees emp
          join   jobs j
          on     j.job_id = emp.employee_job -- I've made some assumptions, here!
          where  emp.department_id = d.department_id
          and    j.job_title like '%Representative%') reps
from     departments d
order by d.department_id;

不过,我个人会使用这样的查询:

select   d.department_id,
         d.department_name,
         count(emp.employee_id) reps
from     departments d
join     employees emp
on       emp.department_id = d.department_id
join     jobs j
on       j.job_id = emp.employee_job -- Same assumption as before!
where    j.job_title like '%Representative%'
group by d.department_id,
         d.department_name
order by d.department_id;

我发现它更容易阅读/解释,但这最终取决于你。

【讨论】:

  • 可能。您没有在原始问题中指定,所以我不得不猜测。
【解决方案2】:

您的示例中缺少一些连接逻辑,但这样的内容可能对您有用:

select d.department_name, count(emp.employee_id)
from departments d, employees emp, jobs j
where j.job_title in (select job_title from jobs where job_title like '%Representative%')
group by d.department_name

SQL 可能不是 100% 正确,但您可以明白这一点。没有所有的连接逻辑就很难完成。

这应该会返回所有部门名称和员工职位包含代表的员工人数。

【讨论】:

    【解决方案3】:

    您不需要为此设置子查询。使用简单的JOIN

      SELECT d.department_name, COUNT(*) AS cnt
        FROM employee e JOIN department d
             ON e.department_id = d.department_id
        JOIN jobs j ON e.jobid = j.jobid
       WHERE j.job_title LIKE '%Representative%'
    GROUP BY d.department_name
    

    或者,如果这只是一个练习,我建议使用以下查询:

    SELECT d.department_name
           , (SELECT COUNT(e.*)
                FROM employees e JOIN jobs j ON e.jobid = j.jobid
               WHERE e.department_id = d.department_id
                 AND j.job_title LIKE '%Representative%') AS cnt
      FROM departments d
    

    然而,在现实世界中,您编写代码是为了方便,而不仅仅是为了锻炼。您的代码应该便于所有参与软件开发过程的人员阅读、理解和维护。如果这只是一个练习,那么您可以使用第二个查询。但如果您必须在实时应用程序中使用查询,则第一个查询中的方法对您周围的每个人都更好。

    【讨论】:

    • “e.job_title”不应该是 j.job_title 吗?因为job_title在jobs表中而不是在employees表中
    • 子查询应该在select子句还是where子句中?
    • 在这种情况下,它必须在SELECT 子句中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多