with t1 as (select d.dept_no, t.title, count(t.title) as count from dept_emp d left join titles t on t.emp_no = d.emp_no group by d.dept_no, t.title) select t1.dept_no, d1.dept_name, t1.title, t1.count from t1 right join departments d1 on t1.dept_no = d1.dept_no order by t1.dept_no asc, t1.title asc
WITH
子句(公共表达式t1
)WITH t1 AS ( 开始定义一个公共表达式(CTE),名称为 t1。在 t1 的内部查询中:SELECT d.dept_no, t.title, COUNT(t.title) AS count:选择了 dept_emp 表(别名为 d)中的部门编号 dept_no、titles 表(别名为 t)中的职称 title,并使用 COUNT 函数计算每个 title 的数量,将结果别名为 count。FROM dept_emp d LEFT JOIN titles t ON t.emp_no = d.emp_no:从 dept_emp 表和 titles 表进行左连接。左连接确保即使 titles 表中没有与 dept_emp 表中 emp_no 匹配的记录,dept_emp 表中的记录仍会被包含在结果中,连接条件是两个表的 emp_no 相等12。GROUP BY d.dept_no, t.title:按照部门编号 dept_no 和职称 title 对结果进行分组。这样,对于每个部门和职称的组合,会计算出相应的 count 值。- 主查询部分SELECT t1.dept_no, d1.dept_name, t1.title, t1.count:从 t1 和 departments 表(别名为 d1)中选择需要的列,包括 t1 中的部门编号 dept_no、departments 表中的部门名称 dept_name、t1 中的职称 title 和数量 count。FROM t1 RIGHT JOIN departments d1 ON t1.dept_no = d1.dept_no:进行右连接操作。右连接确保即使 t1 中没有与 departments 表中 dept_no 匹配的记录,departments 表中的记录仍会被包含在结果中,连接条件是两个表的 dept_no 相等。这一步将部门编号与部门名称关联起来3。ORDER BY t1.dept_no ASC, t1.title ASC:按照 t1 中的部门编号升序(ASC)和职称升序(ASC)对最终结果进行排序。
总体而言,这段代码的目的是统计每个部门中不同职称的员工数量,并将部门编号、部门名称、职称和数量一起展示出来,按照部门编号和职称排序。首先通过 t1
的子查询计算出每个部门和职称组合的数量,然后在主查询中连接部门名称并进行排序输出。