Estoy convirtiendo un viejo sistema basado en MS-Access a PostgreSQL. En Access, los campos formados en SELECT podrían usarse como partes de ecuaciones 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;
Cuando hago esto en PostgreSQL, Postgres arroja un error:
ERROR: la columna "percent_water" no existe.
Así es como puedo solucionarlo, seleccionando una sub-selección:
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;
¿Hay algún tipo de acceso directo como en el primer bloque de código para evitar la anidación complicada? También podría decir 100 * (samples.wet_weight / samples.dry_weight - 1) AS percent_water_100
, pero este es solo un pequeño ejemplo de lo que es un sistema matemático mucho más grande en mi código, con docenas de fragmentos matemáticos más complejos apilados uno encima del otro. Prefiero hacerlo lo más limpio posible sin repetirme.
fuente
Llegué a algo como esto al migrar una consulta Netezza de más de 500 líneas (también conocido como Postgres modificado) a SQL Server. En Netezza, se permitió que el alias de columna calculado se usara como un valor en las referencias posteriores.
Mi trabajo fue usar CROSS APPLY con una subconsulta correlacionada. Lo bueno de esto es que las numerosas referencias al alias de columna en la consulta original no necesitaban modificarse en absoluto.
Usando la consulta desde el OP, el
CROSS APPLY
método se vería así:fuente
CROSS APPLY
(y OUTER APPLY) es la forma en que SQL Server escribeLATERAL
subconsultas.cross apply
en Postgres. Postgres se adhiere al estándar y a los usoscross join lateral
.