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

Analog postgres untuk CROSS APPLY di SQL Server

Di Postgres 9.3 atau yang lebih baru gunakan LATERAL bergabung:

SELECT v.col_a, v.col_b, f.*  -- no parentheses here, f is a table alias
FROM   v_citizenversions v
LEFT   JOIN LATERAL f_citizen_rec_modified(v.col1, v.col2) f ON true
WHERE  f.col_c = _col_c;

Mengapa LEFT JOIN LATERAL ... ON true ?

  • Data yang dikembalikan dari fungsi memiliki kolom yang digabungkan

Untuk versi lama , ada cara yang sangat sederhana untuk mencapai apa yang Menurut saya yang Anda coba dengan fungsi pengembalian set (RETURNS TABLE atau RETURNS SETOF record ATAU RETURNS record ):

SELECT *, (f_citizen_rec_modified(col1, col2)).*
FROM   v_citizenversions v

Fungsi menghitung nilai sekali untuk setiap baris kueri luar. Jika fungsi mengembalikan beberapa baris, baris yang dihasilkan akan dikalikan. Semua kurung secara sintaksis diperlukan untuk menguraikan jenis baris. Fungsi tabel bisa terlihat seperti ini:

CREATE OR REPLACE FUNCTION f_citizen_rec_modified(_col1 int, _col2 text)
  RETURNS TABLE(col_c integer, col_d text) AS
$func$
SELECT s.col_c, s.col_d
FROM   some_tbl s
WHERE  s.col_a = $1
AND    s.col_b = $2
$func$ LANGUAGE sql;

Anda perlu membungkus ini dalam subquery atau CTE jika Anda ingin menerapkan WHERE klausa karena kolom tidak terlihat pada tingkat yang sama. (Dan itu lebih baik untuk kinerja, karena Anda mencegah evaluasi berulang untuk setiap kolom keluaran fungsi):

SELECT col_a, col_b, (f_row).*
FROM (
   SELECT col_a, col_b, f_citizen_rec_modified(col1, col2) AS f_row
   FROM   v_citizenversions v
   ) x
WHERE (f_row).col_c = _col_c;

Ada beberapa cara lain untuk melakukan ini atau yang serupa. Itu semua tergantung pada apa yang Anda inginkan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara keluar dari utilitas baris perintah PostgreSQL:psql

  2. Apakah mungkin untuk mendefinisikan variabel global di postgresql

  3. Bisakah saya meminta Postgresql untuk mengabaikan kesalahan dalam transaksi?

  4. Urutkan berdasarkan kolom ASC, tetapi nilai NULL terlebih dahulu?

  5. Replikasi PostgreSQL untuk Pemulihan Bencana