Estou convertendo um antigo sistema baseado no MS-Access para PostgreSQL. No Access, os campos criados em SELECTs podem ser usados como partes de equações para campos posteriores, como este:
SELECT
samples.id,
samples.wet_weight / samples.dry_weight - 1 AS percent_water,
100 * percent_water AS percent_water_100
FROM samples;
Quando faço isso no PostgreSQL, o Postgres lança um erro:
ERRO: a coluna "percent_water" não existe.
Veja como posso solucionar isso, selecionando uma sub-seleção:
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;
Existe algum tipo de atalho como no primeiro bloco de código para contornar aninhamentos complicados? Eu também poderia dizer 100 * (samples.wet_weight / samples.dry_weight - 1) AS percent_water_100
, mas este é apenas um pequeno exemplo do que é um sistema de matemática muito maior acontecendo no meu código, com dezenas de bits de matemática mais complexos empilhados um sobre o outro. Eu preferiria fazer o mais limpo possível sem me repetir.
fonte
Eu bati em algo assim migrando uma consulta Netezza com mais de 500 linhas (também conhecida como Postgres modificado) para o SQL Server. No Netezza, o alias da coluna computada foi permitido como valor nas referências posteriores.
Minha solução foi usar o CROSS APPLY com uma subconsulta correlacionada. A vantagem disso é que as inúmeras referências ao alias da coluna na consulta original não precisaram ser alteradas.
Usando a consulta do OP, o
CROSS APPLY
método seria algo como:fonte
CROSS APPLY
(e OUTER APPLY) é a maneira de escreverLATERAL
subconsultas do SQL Server .cross apply
no Postgres. O Postgres segue os padrões e usoscross join lateral
.