Saya mengonversi sistem berbasis MS-Access lama ke PostgreSQL. Di Access, bidang yang dibuat dalam SELECT dapat digunakan sebagai bagian dari persamaan untuk bidang selanjutnya, seperti ini:
SELECT
samples.id,
samples.wet_weight / samples.dry_weight - 1 AS percent_water,
100 * percent_water AS percent_water_100
FROM samples;
Ketika saya melakukan ini di PostgreSQL, Postgres melempar kesalahan:
GALAT: kolom "persen_water" tidak ada.
Inilah cara saya dapat mengatasinya, dengan memilih dari sub-pilihan:
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;
Apakah ada cara pintas seperti di blok kode pertama untuk berkeliling bersarang rumit? Saya juga bisa mengatakannya 100 * (samples.wet_weight / samples.dry_weight - 1) AS percent_water_100
, tetapi ini hanyalah contoh kecil dari apa yang terjadi dengan sistem matematika yang lebih besar dalam kode saya, dengan lusinan bit matematika yang lebih rumit ditumpuk satu sama lain. Saya lebih suka melakukan sebersih mungkin tanpa mengulangi sendiri.
sumber
Saya menemukan sesuatu seperti ini, memigrasikan 500+ baris Netezza query (alias modifikasi Postgres) ke SQL Server. Di Netezza alias kolom yang dihitung diizinkan untuk digunakan sebagai nilai dalam referensi hilir.
Pekerjaan saya adalah menggunakan CROSS APPLY dengan sub-kueri yang berkorelasi. Keindahan itu adalah bahwa banyak referensi ke alias kolom dalam permintaan asli tidak perlu diubah sama sekali.
Menggunakan kueri dari OP,
CROSS APPLY
metode akan terlihat seperti:sumber
CROSS APPLY
(dan OUTER BERLAKU) adalah cara SQL Server untuk menulisLATERAL
subqueries.cross apply
di Postgres. Postgres menempel pada standar dan kegunaancross join lateral
.