Написание общих табличных выражений в SQL (Снежинка)

#sql #snowflake-cloud-data-platform #common-table-expression

Вопрос:

Просто учась использовать общие табличные выражения, я хотел бы писать так с самого начала.

Я преобразовал все свои запросы в своей базе данных в формат CTE, используя WITH ... AS только этот, и я борюсь .

Итак, есть две таблицы:

Таблица 1. клиенты

  • customer_id: уникальный идентификатор для каждого клиента
  • полное имя: полное имя клиента

Таблица 2. подписки

  • идентификатор подписки: уникальный идентификатор для подписки
  • customer_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
 

Как я могу переписать это как общее табличное выражение?

Комментарии:

1. Ты не можешь. Это коррелированный подзапрос.

2. @GordonLinoff, хорошо, хммм, можно ли было бы решить вопрос совершенно по-другому, чтобы ответить на тот же вопрос (используя CTE)?

3. . .. Ни CTE, ни вложенный запрос на самом деле не нужны для того, что делает этот запрос.

Ответ №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
;