Konwertuję stary system oparty na MS-Access na PostgreSQL. W programie Access pola utworzone w SELECT mogą być używane jako części równań dla późniejszych pól, takich jak to:
SELECT
samples.id,
samples.wet_weight / samples.dry_weight - 1 AS percent_water,
100 * percent_water AS percent_water_100
FROM samples;
Kiedy robię to w PostgreSQL, Postgres zgłasza błąd:
BŁĄD: kolumna „percent_water” nie istnieje.
Oto jak mogę to obejść, wybierając z podselekcji:
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;
Czy jest jakiś skrót, jak w pierwszym bloku kodu, aby obejść skomplikowane zagnieżdżanie? Mógłbym również powiedzieć 100 * (samples.wet_weight / samples.dry_weight - 1) AS percent_water_100
, ale to tylko mały przykład z tego, co w moim kodzie jest o wiele większym systemem matematycznym, z dziesiątkami bardziej złożonych bitów matematyki ułożonych jeden na drugim. Wolałbym robić tak czysto, jak to możliwe, bez powtarzania się.
źródło
Uderzyłem coś takiego, migrując ponad 500-wierszowe zapytanie Netezza (inaczej zmodyfikowany Postgres) do SQL Server. W Netezza pozwolono na użycie obliczonego aliasu kolumny jako wartości w dalszych odnośnikach.
Moje zadanie polegało na użyciu aplikacji CROSS APPLY ze skorelowanym zapytaniem cząstkowym. Piękno tego polega na tym, że liczne odniesienia do aliasu kolumny w oryginalnym zapytaniu wcale nie musiały być zmieniane.
Przy użyciu zapytania z PO
CROSS APPLY
metoda mogłaby wyglądać mniej więcej tak:źródło
CROSS APPLY
(i ZEWNĘTRZNE ZASTOSOWANIE) to SQL Server sposób pisaniaLATERAL
podkwerend.cross apply
w Postgres. Postgres trzyma się standardu i zastosowańcross join lateral
.