Используя PostgreSQL 9.3, я пытаюсь вычислить некоторые значения на основе результатов отборов из нашей таблицы электронной почты. Вот что я хочу сделать , что, конечно, приводит к ошибке SQL, поскольку вы не можете ссылаться на значения псевдонима в SELECT:
SELECT
email.key,
email.col1,
email.col2,
(SELECT count(sent.subscriber_key) FROM sent WHERE sent.email_id = email.key) AS sent_count,
(SELECT count(bounce.subscriber_key) FROM bounce WHERE bounce.email_id = email.key) AS bounce_count,
((bounce_count / sent_count) * 100) as bounce_pct
FROM
email
ORDER BY
email.key
Я попытался переместить логику выбора в предложение WITH:
WITH
sent_tmp AS (SELECT count(sent.subscriber_key) as count FROM sent INNER JOIN email ON sent.send_id = email.key),
bounce_tmp AS (SELECT count(bounce.subscriber_key) as count FROM bounce INNER JOIN email ON bounce.send_id = email.key)
SELECT
email.key,
email.col1,
email.col2,
email.sent_date,
sent_tmp.count,
bounce_tmp.count,
((bounce_tmp.count / sent_tmp.count) * 100) as bounce_pct
FROM
email,
sent_tmp,
bounce_tmp
ORDER BY
email.key
... и я попытался переместить его в предложение FROM:
SELECT
email.key,
email.col1,
email.col2,
sent_count,
bounce_count,
((bounce_count / sent_count) * 100) as bounce_pct
FROM
email,
(SELECT count(sent.subscriber_key) FROM sent INNER JOIN email ON sent.send_id = email.key) AS sent_count,
(SELECT count(bounce.subscriber_key) FROM bounce INNER JOIN email ON bounce.send_id = email.key) AS bounce_count
ORDER BY
email.key
... но в любом случае получаются неверные отправленные и ненадежные номера . (Все цифры одинаковы для каждого электронного письма.) Я, вероятно, не понимаю порядок выполнения синтаксиса запросов PostgreSQL, или подселекты не оцениваются для каждой строки результатов таблицы электронной почты.
Если кто-то может указать мне правильное направление и сообщить, что возможно, это будет оценено! Я пропускаю какой-то ключевой синтаксис при перемещении логики подбора в WITH или FROM? Нужно ли использовать именованные переменные? Функции?
Я понимаю, что можно добавить еще одну подвыборку, которая будет пересчитывать столбец subscriber_key в таблицах send и bounce, но я пытаюсь избежать пересчета ради эффективности. (И читабельность, в этом отношении.)