Я конвертирую старую систему на основе MS-Access в PostgreSQL. В Access поля, которые были созданы в SELECT, могут использоваться как части уравнений для более поздних полей, например:
SELECT
samples.id,
samples.wet_weight / samples.dry_weight - 1 AS percent_water,
100 * percent_water AS percent_water_100
FROM samples;
Когда я делаю это в PostgreSQL, Postgres выдает ошибку:
ОШИБКА: столбец «процент_воды» не существует.
Вот как я могу обойти это, выбрав из подвыбора:
SELECT
s1.id,
s1.percent_water,
100 * s1.percent_water AS percent_water_100
FROM (
SELECT
samples.id,
samples.wet_weight / samples.dry_weight - 1 AS percent_water
FROM samples
) s1;
Есть ли какой-нибудь ярлык, как в первом блоке кода, чтобы обойти сложное вложение? Я мог бы также просто сказать 100 * (samples.wet_weight / samples.dry_weight - 1) AS percent_water_100
, но это всего лишь небольшой пример из того, что в моем коде происходит намного более крупная математическая система, когда десятки более сложных математических элементов расположены друг над другом. Я бы предпочел сделать как можно более чисто, не повторяясь.
источник
Я столкнулся с чем-то вроде этого, перенеся 500-строчный запрос Netezza (или модифицированный Postgres) на SQL Server. В Netezza вычисленный псевдоним столбца было разрешено использовать в качестве значения в последующих ссылках.
Моя работа заключалась в том, чтобы использовать CROSS APPLY с коррелированным подзапросом. Прелесть этого в том, что многочисленные ссылки на псевдоним столбца в исходном запросе вообще не нужно было менять.
Используя запрос из OP,
CROSS APPLY
метод будет выглядеть примерно так:источник
CROSS APPLY
(и OUTER APPLY) - это способ написанияLATERAL
подзапросов для SQL Server .cross apply
в Postgres. Postgres придерживается стандарта и используетcross join lateral
.