PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Apa perilaku yang diharapkan untuk beberapa fungsi pengembalian set dalam klausa SELECT?

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?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengapa akses array PostgreSQL jauh lebih cepat di C daripada di PL/pgSQL?

  2. konversi tipe data MySQL SET ke Postgres

  3. Apakah spesifikasi JDBC mencegah '?' dari digunakan sebagai operator (di luar tanda kutip)?

  4. Bagaimana cara mendapatkan kunci utama tabel dari Postgres melalui plpgsql?

  5. Bagaimana cara menghentikan/membunuh kueri di postgresql?