sql >> データベース >  >> RDS >> PostgreSQL

古いPostgreSQLバージョンのSELECT...CROSS JOIN LATERAL ...ステートメントを書き直す方法は?

    PostgreSQLは、SELECTでのset-returning関数の呼び出しをサポートしています。 句。 LATERALができたので、これはやや非推奨になりました。 動作がかなり不安定であるため、確かに推奨されませんが、引き続き有用です。

    あなたの場合、あなたは書くことができます:

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

    ただし、これにより、partition_into_monthsが1回呼び出される可能性があります。 (fn).*が原因で、列ごとに返される 基本的には(fn).col1, (fn).col2, ...にマクロ展開されます 。これを回避するには、サブクエリでラップします。例:

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

    SELECTに複数のセットを返す関数があると、奇妙な結果が発生することに注意してください。 リスト。あなたが期待するようなクロスジョインではありません。たとえば、次のように比較します。

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

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



    1. PostgresNOSQLjsonデータのjson配列の合計を取得します

    2. PostreSQLに新しい行のみを一括挿入する方法

    3. 1つの列が複数の列に移動するようにSQL結果を転置する

    4. EntityFrameworkを使用してデータベースの独立性を実装する方法