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

Jak přepsat příkaz SELECT ... CROSS JOIN LATERAL ... pro starší verze PostgreSQL?

PostgreSQL podporuje volání funkcí vracejících sadu v SELECT doložka. Toto je nyní poněkud zastaralé, když máme LATERAL a rozhodně ho to odrazuje, protože se chová poněkud nevyzpytatelně, ale zůstává užitečné.

Ve vašem případě můžete napsat:

SELECT 
  i.*,
  (partition_into_months(i.start_date, i.stop_or_current_date)).*
FROM invoicable_interval i;

To však může vést k jednomu volání partition_into_months za sloupec vrácený, protože (fn).* je v podstatě makro-rozšířený do (fn).col1, (fn).col2, ... . Chcete-li se tomu vyhnout, můžete jej zabalit do dílčího dotazu, např.

SELECT (x.i).*, (x.p).*
FROM
(
  SELECT 
    i,
    partition_into_months(i.start_date, i.stop_or_current_date) p
  FROM invoicable_interval i
) x(i,p);

Všimněte si, že v přítomnosti více set vracejících funkcí v SELECT dojde k podivným výsledkům seznam. Není to křížové spojení, jak byste očekávali. Porovnejte například:

SELECT generate_series(1,4), generate_series(1,4)

do

SELECT generate_series(1,4), generate_series(1,3);



  1. Vygenerujte pole PHP z MySQL s hodnotou klíče ze sloupce id

  2. jak vytvořit db mysql pomocí sqlalchemy

  3. Chyba při importu Pythonu MySQLdb - Mac 10.6

  4. Najděte všechna PSČ v zadané vzdálenosti od PSČ