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

Simpan kueri umum sebagai kolom?

Apakah ada cara untuk menyimpan sub-pilihan itu sebagai kolom semu dalam tabel?

VIEW seperti yang telah disarankan adalah solusi yang benar-benar valid. Lakukan.

Tetapi ada cara lain yang lebih cocok dengan pertanyaan Anda. Anda dapat menulis fungsi yang menggunakan tipe tabel sebagai parameter untuk meniru "bidang yang dihitung" atau "kolom yang dibuat" .

Pertimbangkan kasus uji ini, yang diturunkan dari deskripsi Anda:

CREATE TABLE tbl_a (a_id int, col1 int, col2 int);
INSERT INTO tbl_a VALUES (1,1,1), (2,2,2), (3,3,3), (4,4,4);

CREATE TABLE tbl_b (b_id int, a_id int, colx int);
INSERT INTO tbl_b VALUES
  (1,1,5),  (2,1,5),  (3,1,1)
, (4,2,8),  (5,2,8),  (6,2,6)
, (7,3,11), (8,3,11), (9,3,11);

Buat fungsi yang mengemulasi col3 :

CREATE FUNCTION col3(tbl_a)
  RETURNS int8
  LANGUAGE sql STABLE AS
$func$
SELECT sum(colx)
FROM   tbl_b b
WHERE  b.a_id = $1.a_id
$func$;

Sekarang Anda dapat menanyakan:

SELECT a_id, col1, col2, tbl_a.col3
FROM   tbl_a;

Atau bahkan:

SELECT *, a.col3 FROM tbl_a a;

Perhatikan bagaimana saya menulis tbl_a.col3 / a.col3 , bukan hanya col3 . Ini penting .

Tidak seperti "kolom virtual" di Oracle, ini tidak disertakan secara otomatis dalam SELECT * FROM tbl_a . Anda dapat menggunakan VIEW untuk itu.

Mengapa ini berhasil?

Cara umum untuk mereferensikan kolom tabel adalah dengan notasi atribut :

SELECT tbl_a.col1 FROM tbl_a;

Cara umum untuk memanggil fungsi adalah dengan notasi fungsional :

SELECT col3(tbl_a);

Umumnya, yang terbaik adalah berpegang teguh pada cara kanonik ini , yang sesuai dengan standar SQL.

Tetapi Postgres juga mengizinkan notasi atribut. Ini juga berfungsi:

SELECT col1(tbl_a) FROM tbl_a;
SELECT tbl_a.col3;

Lebih lanjut tentang itu di manual.
Anda mungkin sudah tahu sekarang, ke mana arahnya. ini terlihat seperti Anda akan menambahkan kolom tambahan dari tabel tbl_a sementara col3() sebenarnya adalah fungsi yang mengambil baris tbl_a saat ini (atau aliasnya) sebagai argumen tipe baris dan menghitung nilai.

SELECT *, a.col3
FROM   tbl_a AS a;

Jika ada kolom sebenarnya col3 dibutuhkan prioritas dan sistem tidak mencari fungsi dari nama itu mengambil baris tbl_a sebagai parameter.

"Keindahan"nya:Anda dapat menambahkan atau melepaskan kolom dari tbl_a dan kueri terakhir akan secara dinamis mengembalikan semua kolom saat ini, di mana tampilan hanya akan mengembalikan kolom seperti itu yang ada pada waktu pembuatan (pengikatan awal vs. pengikatan akhir * ).
Tentu saja, Anda harus menghapus fungsi depend sebelum Anda dapat menghapus tabel sekarang. Dan Anda harus berhati-hati agar tidak membatalkan fungsi saat membuat perubahan pada tabel.

Saya tetap tidak akan menggunakannya. Ini terlalu mengejutkan bagi pembaca yang tidak bersalah.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kesalahan postgres memperbarui data kolom

  2. PGEast, Pembandingan Perangkat Keras, dan PG Performance Farm

  3. Memasukkan array menggunakan permata Sekuel di PostgreSQL

  4. Tidak ada driver yang cocok ditemukan saat menyertakan driver yang dibutuhkan dengan maven-assembly-plugin

  5. Cara Memisahkan String di PostgreSQL