首页 > 解决方案 > WITH 子句如何知道要使用哪个表?

问题描述

我在一本书中遇到了以下 SQL 语句:

WITH dcount AS
(
    SELECT deptno, COUNT(*) AS dcount
    FROM employees
    GROUP BY deptno
)
SELECT 
    e.lname EMP_lastname,
    e.deptno e_dept,
    d1.dcount edept_count,
    m.lname manager_name,
    m.deptno mdept,
    d2.dcount mdept_count
FROM 
    employees e,
    dcount d1,
    employees m,
    dcount d2
WHERE 
    e.deptno = d1.deptno
    AND e.mgr = m.empno
    AND m.deptno = d2.deptno
    AND e.mgr = 7839

该语句的目的是显示员工姓名、他们工作的部门、该部门的同事人数、经理的姓名以及经理所在部门的人数。

让我困惑的部分是 d1.count 和 d2.count。如果计数基于相同的 WITH 语句,它如何计算不同的事物?

标签: sql

解决方案


主查询连接相同的CTE,但每次都使用不同的连接谓词:

  • 它正在d1使用e.deptno = d1.deptno.
  • 它正在d2使用m.deptno = d2.deptno.

因此,每个结果行都从 CTE 中选择不同的行。


推荐阅读