Postgres 10 atau lebih baru
menambahkan nilai null untuk set yang lebih kecil. Demo dengan generate_series()
:
SELECT generate_series( 1, 2) AS row2
, generate_series(11, 13) AS row3
, generate_series(21, 24) AS row4;
row2 | row3 | row4 -----+------+----- 1 | 11 | 21 2 | 12 | 22 null | 13 | 23 null | null | 24
dbfiddle di sini
Manual untuk Postgres 10 :
Jika ada lebih dari satu set-pengembalian fungsi dalam daftar pilihan kueri, perilakunya mirip dengan apa yang Anda dapatkan dari menempatkan fungsi ke dalam satu
LATERAL ROWS FROM( ... )
FROM
-klausa item. Untuk setiap baris dari kueri yang mendasarinya, ada baris keluaran menggunakan hasil pertama dari setiap fungsi, lalu baris keluaran menggunakan hasil kedua, dan seterusnya. Jika beberapa fungsi pengembalian himpunan menghasilkan keluaran lebih sedikit daripada yang lain, nilai nol diganti untuk data yang hilang, sehingga jumlah total baris yang dipancarkan untuk satu baris yang mendasarinya sama dengan fungsi pengembalian himpunan yang menghasilkan keluaran terbanyak. Dengan demikian, fungsi pengembalian-set berjalan "dalam langkah kunci" sampai semuanya habis, dan kemudian eksekusi dilanjutkan dengan baris berikutnya.
Ini mengakhiri perilaku aneh yang tradisional.
Postgres 9.6 atau lebih lama
Jumlah baris hasil (agak mengejutkan!) adalah kelipatan persekutuan terendah dari semua set dalam SELECT
. yang sama daftar. (Hanya bertindak seperti CROSS JOIN
jika tidak ada pembagi umum untuk semua ukuran yang ditetapkan!) Demo:
SELECT generate_series( 1, 2) AS row2
, generate_series(11, 13) AS row3
, generate_series(21, 24) AS row4;
row2 | row3 | row4 -----+------+----- 1 | 11 | 21 2 | 12 | 22 1 | 13 | 23 2 | 11 | 24 1 | 12 | 21 2 | 13 | 22 1 | 11 | 23 2 | 12 | 24 1 | 13 | 21 2 | 11 | 22 1 | 12 | 23 2 | 13 | 24
dbfiddle di sini
Didokumentasikan dalam manual untuk Postgres 9.6 bab Set Pengembalian Fungsi SQL , beserta rekomendasi untuk menghindarinya:
Catatan:Masalah utama dengan menggunakan fungsi set-return dalam daftar pilihan, bukan
FROM
klausa, adalah bahwa menempatkan lebih dari satu set-fungsi pengembalian dalam daftar pilih yang sama tidak berperilaku sangat masuk akal. (Apa yang sebenarnya Anda dapatkan jika melakukannya adalah jumlah baris keluaran yang sama dengan kelipatan persekutuan terkecil dari jumlah baris yang dihasilkan oleh setiap fungsi pengembalian himpunan. )LATERAL
sintaks tidak menghasilkan hasil yang mengejutkan saat memanggil beberapa fungsi pengembalian-set, dan biasanya harus digunakan sebagai gantinya.
Penekanan saya yang berani.
Fungsi pengembalian set tunggal OK (tetapi masih lebih bersih di FROM
list), tetapi beberapa dalam SELECT
same yang sama daftar putus asa sekarang. Ini adalah fitur yang berguna sebelum kami memiliki LATERAL
bergabung. Sekarang hanya pemberat sejarah.
Terkait:
- Paralel unnest() dan urutkan urutan di PostgreSQL
- Hapus beberapa array secara paralel
- Apa perbedaan antara LATERAL JOIN dan subquery di PostgreSQL?