【问题标题】:Writing Common Table Expressions in SQL (Snowflake)用 SQL 编写公用表表达式 (Snowflake)
【发布时间】:2021-09-16 22:14:27
【问题描述】:

刚刚学习如何使用常用的表表达式,我希望我从一开始就这样写。

我已使用 WITH ... AS 将数据库中的所有查询转换为 CTE 格式,但我正在努力解决这个问题。

所以有两个表:

表 1. 客户

  • customer_id:每个客户的唯一 ID
  • full_name:客户全名

表 2. 订阅

  • subscription_id:订阅的唯一 ID
  • customer_id:订阅客户的 ID
  • 标题:订阅名称

以下查询用于返回您的每个客户有多少订阅:

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

如何将其重写为公用表表达式?

【问题讨论】:

  • 你不能。它是一个相关子查询。
  • @GordonLinoff,好吧,嗯,是否有可能解决完全不同的问题来回答同一个问题(使用 CTE)?
  • 。 .这个查询的作用既不需要 CTE 也不需要子查询。

标签: sql snowflake-cloud-data-platform common-table-expression


【解决方案1】:

如果您真的想使用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;

【讨论】:

    【解决方案2】:

    当然。你可以先计算聚合,然后加入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
    ;
    

    【讨论】:

      猜你喜欢
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多