[sql]with子句

52 阅读1分钟

你的理解完全正确!在 SQL 的 WITH 子句(Common Table Expression,公共表达式) 中:

在SQL中,WITH子句(也称为‌通用表表达式‌或‌CTE‌)主要用于定义一个‌临时的结果集‌,这个结果集可以在后续的查询中像普通表一样被引用。它只在当前查询执行期间存在,用完即销

语法规则:

WITH 
  cte1 AS (SELECT ...),  -- 第一个CTE
  cte2 AS (SELECT ...),  -- 第二个CTE
  cte3 AS (SELECT ...)   -- 最后一个CTE后面不加逗号
SELECT ...
FROM cte3;

正确示例:

-- 正确写法:最后一个CTE后面没有逗号
WITH 
  departments AS (
    SELECT id, name FROM dept
  ),
  employees AS (
    SELECT id, name, dept_id FROM emp
  ),  -- 注意:这里employees后面有逗号
  emp_dept AS (
    SELECT e.name AS emp_name, d.name AS dept_name
    FROM employees e
    JOIN departments d ON e.dept_id = d.id
  )  -- 注意:最后一个emp_dept后面没有逗号
SELECT * FROM emp_dept;

常见错误:

-- 错误写法:最后一个CTE后面加了逗号
WITH 
  cte1 AS (SELECT ...),
  cte2 AS (SELECT ...),  -- ❌ 错误:最后一个后面不应该有逗号
SELECT ...  -- 这里会报语法错误

补充说明:

  1. CTE之间用逗号分隔,类似定义变量列表
  2. 最后一个CTE后面直接跟主查询,没有分隔符
  3. CTE可以链式引用(后面的CTE可以引用前面定义的CTE)

所以你的理解是完全准确的!记住这个规则可以避免很多语法错误。