跳转到主要内容
模块 14 · 第 2 课(共 3)课程中的54/57~15 min
模块课程(2/3)

多个和链式 CTE

多重和链式 CTE

当您将多个表达式链接在一起时,WITH 表达式的优雅确实会闪闪发光。您可以连续定义多个 CTE,并用逗号分隔它们。

这是重构纯粹​​主义者喜欢的东西:后来的 CTE 可以从早期的 CTE 读取数据,逐段解包顺序计算!

多 CTE 示例

SQL
WITH premium_customers AS (
  SELECT customer_id, SUM(total_amount) AS total_spent
  FROM orders
  GROUP BY customer_id
),
top_customers AS (
  SELECT * FROM premium_customers
  WHERE total_spent > 5000
)
SELECT c.first_name, tc.total_spent
FROM customers c
JOIN top_customers tc ON c.id = tc.customer_id;

这是块式编程!每个块只做一项工作。

锻炼#sql.m14.l2.e1
尝试:0加载中...

定义两个连续的 CTE:\n1) 'order_totals' 计算 'customer_id' 和使用 'orders' 中的 COUNT(*)` 放置的 'order_count'。\n2) 'gold_users' 从 'order_totals' 读取,过滤 'order_count >= 2' 的客户。\n最后加入 'customers' 表(提取 'first_name' 和'last_name')和'gold_users'(ON c.id = g.customer_id),并显示他们的'order_count'。

正在加载编辑器...
显示提示

用逗号分隔 order_totals 和 gold_users(没有第二个!)

3 次尝试后可用的解决方案

锻炼#sql.m14.l2.e2
尝试:0加载中...

现在让我们使用多个 CTE 来简化指标:创建“max_price”(使用“order_items”中的“MAX(unit_price)”提取具有“max_value”的单行)。在主查询中,从“order_items”中提取每个“product_id”和“unit_price”,并显示其与最高价格的差异,计算“(SELECT max_value FROM max_price) - unit_price AS Difference”。无连接 — 在 CTE 上使用子查询来获取单个值!

正在加载编辑器...
显示提示

WITH max_price AS (...) SELECT Product_id, unit_price, (SELECT max_value FROM max_price) - unit_price FROM order_items;

3 次尝试后可用的解决方案