在 SQL 中编写常见的 Table 表达式(雪花)
Writing Common Table Expressions in SQL (Snowflake)
刚刚学习如何使用常用的 table 表达式,我希望我在门口就这样写。
我已经使用 WITH ... AS
将我数据库中的所有查询转换为 CTE 格式,但我正在努力解决这个问题。
所以有两个table:
Table 1. 客户
- customer_id:每个客户的唯一 ID
- full_name: 客户全名
Table 2. 订阅
- subscription_id: 订阅的唯一 ID
- customer_id: 订阅订阅的客户的 id
- 标题:订阅名称
以下查询用于return您的每个客户有多少订阅:
SELECT c.customer_id, c.full_name,
(
SELECT COUNT(*)
FROM subscriptions s
WHERE s.customer_id = c.customer_id
GROUP BY s.customer_id
) subscriptions_count
FROM customers c
如何将其重写为通用 Table 表达式?
当然可以。您可以先计算聚合,然后加入 customers
:
WITH cte AS (
SELECT customer_id
, COUNT(*) AS n
FROM subscriptions
GROUP BY customer_id
)
SELECT c.*
, COALESCE(cte.n, 0) AS n
FROM customers AS c
LEFT JOIN cte
ON c.customer_id = cte.customer_id
;
如果您真的想使用 CTE
,这是一种方法。如果您希望向没有计数的客户显示
,您可以将其重写为使用 left join
with cte as
(select customer_id, count(*) as counts
from subscriptions
group by customer_id)
select c.customer_id, c.full_name, s.counts
from customers c
join cte s on s.customer_id=c.customer_id;
刚刚学习如何使用常用的 table 表达式,我希望我在门口就这样写。
我已经使用 WITH ... AS
将我数据库中的所有查询转换为 CTE 格式,但我正在努力解决这个问题。
所以有两个table:
Table 1. 客户
- customer_id:每个客户的唯一 ID
- full_name: 客户全名
Table 2. 订阅
- subscription_id: 订阅的唯一 ID
- customer_id: 订阅订阅的客户的 id
- 标题:订阅名称
以下查询用于return您的每个客户有多少订阅:
SELECT c.customer_id, c.full_name,
(
SELECT COUNT(*)
FROM subscriptions s
WHERE s.customer_id = c.customer_id
GROUP BY s.customer_id
) subscriptions_count
FROM customers c
如何将其重写为通用 Table 表达式?
当然可以。您可以先计算聚合,然后加入 customers
:
WITH cte AS (
SELECT customer_id
, COUNT(*) AS n
FROM subscriptions
GROUP BY customer_id
)
SELECT c.*
, COALESCE(cte.n, 0) AS n
FROM customers AS c
LEFT JOIN cte
ON c.customer_id = cte.customer_id
;
如果您真的想使用 CTE
,这是一种方法。如果您希望向没有计数的客户显示
left join
with cte as
(select customer_id, count(*) as counts
from subscriptions
group by customer_id)
select c.customer_id, c.full_name, s.counts
from customers c
join cte s on s.customer_id=c.customer_id;