#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
;