sql >> Databáze >  >> RDS >> PostgreSQL

Postgres analogie k CROSS APPLY na SQL Server

V Postgres 9.3 nebo později použijte LATERAL připojit se:

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;

Proč LEFT JOIN LATERAL ... ON true ?

  • Záznam vrácený funkcí má zřetězené sloupce

Pro starší verze , existuje velmi jednoduchý způsob, jak dosáhnout toho, co si myslím se pokoušíte pomocí funkce vracení sady (RETURNS TABLE nebo RETURNS SETOF record NEBO RETURNS record ):

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

Funkce vypočítá hodnoty jednou pro každý řádek vnějšího dotazu. Pokud funkce vrátí více řádků, výsledné řádky se odpovídajícím způsobem vynásobí. Všechny závorky jsou syntakticky povinné k rozložení typu řádku. Funkce tabulky by mohla vypadat nějak takto:

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;

Pokud chcete použít WHERE, musíte to zabalit do dílčího dotazu nebo CTE klauzule, protože sloupce nejsou viditelné na stejné úrovni. (A je to každopádně lepší pro výkon, protože zabráníte opakovanému vyhodnocení pro každý výstupní sloupec funkce):

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;

Existuje několik dalších způsobů, jak to udělat nebo něco podobného. Vše záleží na tom, co přesně chcete.



  1. Kde podmínka pro spojenou tabulku v Sequelize ORM

  2. Jak získat hodnoty, které neobsahují čísla v SQL Server

  3. Typy dat SQL VARCHAR Co dělat a co nedělat pro rychlejší databáze

  4. PG::Chyba v klauzuli GROUP BY