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

Mengapa PostgreSQL menggabungkan seri dengan cara yang salah?

Ini adalah kekhasan tentang bagaimana beberapa fungsi pengembalian-set dieksekusi ketika dipanggil di SELECT -daftar. Anda mengharapkan hasilnya menjadi produk silang dari keduanya, tetapi bukan itu cara kerjanya. Ini sebenarnya adalah kelipatan persekutuan terendah dari jumlah baris keduanya.

Lihat:

Bandingkan:

test=>     SELECT generate_series(1,3) aval, generate_series(1,4) bval;
 aval | bval 
------+------
    1 |    1
    2 |    2
    3 |    3
    1 |    4
    2 |    1
    3 |    2
    1 |    3
    2 |    4
    3 |    1
    1 |    2
    2 |    3
    3 |    4
(12 rows)

test=>     SELECT generate_series(1,3) aval, generate_series(1,3) bval;
 aval | bval 
------+------
    1 |    1
    2 |    2
    3 |    3
(3 rows)

Untuk alasan ini, pada PostgreSQL 9.2 dan di atasnya Anda harus menggunakan LATERAL kueri tempat Anda menjalankan fungsi pengembalian set di FROM klausa:

test=>     SELECT aval, bval FROM generate_series(1,3) aval CROSS JOIN LATERAL generate_series(1,3) bval;
 aval | bval 
------+------
    1 |    1
    1 |    2
    1 |    3
    2 |    1
    2 |    2
    2 |    3
    3 |    1
    3 |    2
    3 |    3
(9 rows)

test=>     SELECT aval, bval FROM generate_series(1,3) aval CROSS JOIN LATERAL generate_series(1,4) bval;
 aval | bval 
------+------
    1 |    1
    1 |    2
    1 |    3
    1 |    4
    2 |    1
    2 |    2
    2 |    3
    2 |    4
    3 |    1
    3 |    2
    3 |    3
    3 |    4
(12 rows)

Pada versi yang lebih lama, Anda dapat menggunakan subquery-in-FROM untuk menghindari beberapa SRF dalam istilah SELECT:

test=> SELECT generate_series(1,3) aval, bval FROM (SELECT generate_series(1,4)) AS x(bval);
 aval | bval 
------+------
    1 |    1
    2 |    1
    3 |    1
    1 |    2
    2 |    2
    3 |    2
    1 |    3
    2 |    3
    3 |    3
    1 |    4
    2 |    4
    3 |    4
(12 rows)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Buat tabel Postgresql dari Skema Avro di Nifi

  2. Menghilangkan PostgreSQL Split-Brain di Database Multi-Cloud

  3. Mengumumkan Barman 1.0, Manajer Pencadangan dan Pemulihan untuk PostgreSQL

  4. Bagaimana cara meneruskan parameter ke pernyataan 'dalam' sql?

  5. Migrasi Rails + Postgres - mengapa saya menerima kesalahan PG::UndefinedFunction:ERROR:function gen_random_uuid() tidak ada?