SELECT
PernyataanMasalahnya:
Menggunakan berbilang fungsi pengembalian set dalam klausa pernyataan SELECT
boleh menghasilkan hasil yang tidak dijangka, terutamanya apabila set mempunyai panjang yang tidak sama. Semasa generate_series(1, 3)
dan generate_series(5, 7)
menghasilkan cantuman silang, generate_series(1, 2)
dan generate_series(1, 4)
tidak. Ketidakkonsistenan ini membingungkan.
Penjelasan:
Kuncinya terletak pada perbezaan versi PostgreSQL. Versi PostgreSQL 10 dan lebih baru mengendalikan ini secara berbeza daripada versi terdahulu (9.6 dan sebelumnya).
PostgreSQL 10 dan Kemudian:
PostgreSQL 10 dan keluaran seterusnya merawat berbilang fungsi pengembalian set dalam senarai SELECT
sama dengan klausa LATERAL ROWS FROM(...)
. Fungsi dilaksanakan secara serentak, dan set yang lebih pendek dilapisi dengan nilai NULL
untuk memadankan panjang set terpanjang. Ini memastikan sambung silang yang lengkap. Contohnya:
<code>row2 | row3 | row4 -----+------+----- 1 | 11 | 21 2 | 12 | 22 NULL | 13 | 23 NULL | NULL | 24</code>
PostgreSQL 9.6 dan Terdahulu:
Dalam versi lama (9.6 dan sebelumnya), kiraan baris set hasil menyamai gandaan sepunya terkecil (LCM) bagi kiraan baris fungsi individu. Cantuman silang hanya berlaku jika saiz set berkongsi tiada pembahagi biasa. Menggunakan contoh yang sama, outputnya ialah:
<code>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</code>
Amalan Terbaik:
Untuk mengelakkan hasil yang tidak dijangka, sebaiknya gunakan LATERAL
join atau subqueries daripada meletakkan terus berbilang fungsi set-return dalam senarai SELECT
. Ini memberikan kawalan yang lebih jelas dan tingkah laku yang boleh diramal.
Untuk butiran lanjut dan maklumat berkaitan, rujuk dokumentasi rasmi PostgreSQL:
Atas ialah kandungan terperinci Mengapakah Fungsi Pengembalian Berbilang Set dalam Klausa SELECT Tidak Sentiasa Menghasilkan Gabungan Silang dalam PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!