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

Postgres odpowiednik CROSS APPLY w SQL Server

W Postgresie 9.3 lub później użyj LATERAL dołącz:

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;

Dlaczego LEFT JOIN LATERAL ... ON true ?

  • Rekord zwrócony z funkcji zawiera połączone kolumny

Dla starszych wersji , jest bardzo prosty sposób na osiągnięcie tego, co myślę próbujesz z funkcją zwracającą zestaw (RETURNS TABLE lub RETURNS SETOF record LUB RETURNS record ):

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

Funkcja oblicza wartości raz dla każdego wiersza zapytania zewnętrznego. Jeśli funkcja zwraca wiele wierszy, wynikowe wiersze są odpowiednio mnożone. Wszystkie nawiasy są wymagane składni rozłożyć typ wiersza. Funkcja tabeli może wyglądać mniej więcej tak:

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;

Musisz umieścić to w podzapytaniu lub CTE, jeśli chcesz zastosować WHERE klauzula, ponieważ kolumny nie są widoczne na tym samym poziomie. (I tak jest to lepsze dla wydajności, ponieważ zapobiegasz powtarzaniu oceny dla każdej kolumny wyjściowej funkcji):

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;

Istnieje kilka innych sposobów na zrobienie tego lub czegoś podobnego. Wszystko zależy od tego, czego dokładnie chcesz.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przegląd parametrów połączenia libpq sslpassword w PostgreSQL 13

  2. Tworzenie tabel tymczasowych w SQL

  3. Webinarium:Nowe funkcje w Postgres 12 [Kontynuacja]

  4. Jak klastrować Odoo 12 za pomocą replikacji strumieniowej PostgreSQL w celu zapewnienia wysokiej dostępności?

  5. Notacja z podwójnym dwukropkiem (::) w SQL