PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Zapisać wspólne zapytanie jako kolumnę?

Czy istnieje sposób na zapisanie tej podselekcji jako pseudokolumny w tabeli?

VIEW jak zostało zalecone, jest całkowicie słusznym rozwiązaniem. Idź po to.

Ale jest inny sposób, który jeszcze bardziej pasuje do twojego pytania. Możesz napisać funkcję, która przyjmuje typ tabeli jako parametr do emulowania "pole obliczane" lub „wygenerowana kolumna” .

Rozważ ten przypadek testowy, pochodzący z twojego opisu:

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);

Utwórz funkcję emulującą 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$;

Teraz możesz zapytać:

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

Lub nawet:

SELECT *, a.col3 FROM tbl_a a;

Zwróć uwagę, jak napisałem tbl_a.col3 / a.col3 , nie tylko col3 . To jest niezbędne .

W przeciwieństwie do „wirtualnej kolumny” w Oracle, nie zawarte automatycznie w SELECT * FROM tbl_a . Możesz użyć VIEW za to.

Dlaczego to działa?

Typowym sposobem odwoływania się do kolumny tabeli jest notacja atrybutów :

SELECT tbl_a.col1 FROM tbl_a;

Typowym sposobem wywoływania funkcji jest notacja funkcjonalna :

SELECT col3(tbl_a);

Ogólnie rzecz biorąc, najlepiej trzymać się tych kanonicznych sposobów , które są zgodne ze standardem SQL.

Ale Postgres umożliwia także notację atrybutów. Działają one również:

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

Więcej na ten temat w instrukcji.
Prawdopodobnie już wiesz, dokąd to zmierza. To wygląda tak jakbyś dodał dodatkową kolumnę tabeli tbl_a podczas gdy col3() jest w rzeczywistości funkcją, która pobiera bieżący wiersz tbl_a (lub jego alias) jako argument typu wiersza i oblicza wartość.

SELECT *, a.col3
FROM   tbl_a AS a;

Jeśli istnieje rzeczywista kolumna col3 ma priorytet, a system nie szuka funkcji o tej nazwie, biorąc wiersz tbl_a jako parametr.

„Piękno” tego:możesz dodawać lub usuwać kolumny z tbl_a a ostatnie zapytanie dynamicznie zwróci wszystkie bieżące kolumny, podczas gdy widok zwróci tylko te kolumny, które istniały w czasie tworzenia (wczesne wiązanie a późne wiązanie * ).
Oczywiście musisz usunąć zależną funkcję, zanim będziesz mógł teraz usunąć tabelę. I musisz uważać, aby nie unieważnić funkcji podczas wprowadzania zmian w tabeli.

Nadal bym tego nie użył. To zbyt zaskakujące dla niewinnego czytelnika.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak chronić bazy danych PostgreSQL przed cyberatakami za pomocą zapory SQL?

  2. Wskazówki dotyczące zdalnego zarządzania PostgreSQL

  3. Jak zresetować uruchomioną sumę po osiągnięciu progu?

  4. Termin składni SQL dla „GDZIE (col1, col2) <(val1, val2)”

  5. Dynamicznie generuj kolumny dla tabeli krzyżowej w PostgreSQL