Rumah > pangkalan data > tutorial mysql > Mengapakah Fungsi Pengembalian Berbilang Set dalam Klausa SELECT Tidak Sentiasa Menghasilkan Gabungan Silang dalam PostgreSQL?

Mengapakah Fungsi Pengembalian Berbilang Set dalam Klausa SELECT Tidak Sentiasa Menghasilkan Gabungan Silang dalam PostgreSQL?

Barbara Streisand
Lepaskan: 2025-01-17 23:57:09
asal
124 orang telah melayarinya

Why Do Multiple Set-Returning Functions in a SELECT Clause Not Always Produce a Cross Join in PostgreSQL?

Gelagat Tidak Dijangka PostgreSQL dengan Berbilang Fungsi Pengembalian Set dalam SELECT Pernyataan

Masalahnya:

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan