sql >> Database >  >> RDS >> PostgreSQL

Hoe herschrijf ik een SELECT ... CROSS JOIN LATERAL ...-instructie voor oudere PostgreSQL-versies?

PostgreSQL ondersteunt het aanroepen van set-returning-functies in de SELECT clausule. Dit is enigszins verouderd nu we LATERAL . hebben en wordt zeker ontmoedigd omdat het nogal grillig gedrag vertoont, maar het blijft nuttig.

In jouw geval zou je kunnen schrijven:

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

Dit kan echter resulteren in één aanroep naar partition_into_months per kolom geretourneerd omdat (fn).* is in principe macro-uitgebreid tot (fn).col1, (fn).col2, ... . Om dit te voorkomen, kunt u het in een subquery plaatsen, bijvoorbeeld

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

Merk op dat er vreemde resultaten zullen worden gevonden in de aanwezigheid van meerdere set terugkerende functies in de SELECT lijst. Het is geen cross-join zoals je zou verwachten. Vergelijk bijvoorbeeld:

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

naar

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



  1. Realtime gegevensmaskering met behulp van triggers

  2. Log foutmeldingen in Oracle opgeslagen procedure

  3. ORACLE 12.2.01 selecteren van kolommen uit verschillende tabellen met vergelijkbare namen --> interne kolom-ID gebruikt

  4. ActiveRecord::StatementInvalid:Mysql2::Error:Kan een bovenliggende rij niet verwijderen of bijwerken - Rails 4.2.6