Je convertis un ancien système basé sur MS-Access en PostgreSQL. Dans Access, les champs constitués dans SELECT peuvent être utilisés comme parties d'équations pour des champs ultérieurs, comme ceci:
SELECT
samples.id,
samples.wet_weight / samples.dry_weight - 1 AS percent_water,
100 * percent_water AS percent_water_100
FROM samples;
Quand je fais cela dans PostgreSQL, Postgres lance une erreur:
ERREUR: la colonne "percent_water" n'existe pas.
Voici comment je peux contourner ce problème en sélectionnant une sous-sélection:
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-t-il une sorte de raccourci comme dans le premier bloc de code pour contourner l'imbrication compliquée? Je pourrais également dire 100 * (samples.wet_weight / samples.dry_weight - 1) AS percent_water_100
, mais ce n'est qu'un petit exemple de ce qui est un système de mathématiques beaucoup plus vaste dans mon code, avec des dizaines de bits de mathématiques plus complexes empilés les uns sur les autres. Je préfère faire le plus proprement possible sans me répéter.
la source
J'ai frappé quelque chose comme ça en migrant une requête Netezza de plus de 500 lignes (aka Postgres modifié) vers SQL Server. Dans Netezza, l'alias de colonne calculé pouvait être utilisé comme valeur dans les références en aval.
Mon travail consistait à utiliser CROSS APPLY avec une sous-requête corrélée. La beauté de celui-ci est que les nombreuses références à l'alias de colonne dans la requête d'origine n'avaient pas du tout besoin d'être modifiées.
En utilisant la requête de l'OP, la
CROSS APPLY
méthode ressemblerait à quelque chose comme:la source
CROSS APPLY
(et OUTER APPLY) est la façon dont SQL Server écrit lesLATERAL
sous-requêtes.cross apply
en a pas à Postgres. Postgres s'en tient à la norme et utilisecross join lateral
.