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

SQLServerのCROSSAPPLYに類似したPostgres

    Postgresで9.3 または後でLATERALを使用します 参加:

    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;
    

    なぜLEFT JOIN LATERAL ... ON true

    • 関数から返されたレコードには、列が連結されています

    古いバージョンの場合 、私が思うことを達成するための非常に簡単な方法があります セットを返す関数(RETURNS TABLE)を使用しようとしています またはRETURNS SETOF record またはRETURNS record ):

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

    この関数は、外部クエリの行ごとに1回値を計算します。関数が複数の行を返す場合、結果の行はそれに応じて乗算されます。すべての括弧は構文的に必要です 行タイプを分解します。テーブル関数は次のようになります。

    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;
    

    WHEREを適用する場合は、これをサブクエリまたはCTEでラップする必要があります 列が同じレベルに表示されないため、句。 (そして、関数のすべての出力列に対して繰り返し評価されるのを防ぐので、とにかくパフォーマンスに優れています):

    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;
    

    これまたは同様のことを行うには、他にもいくつかの方法があります。それはすべてあなたが正確に何を望んでいるかに依存します。



    1. JDBC for Oracleを使用してResultSetを反復処理するには、約16秒かかりますか?

    2. SQL Serverデータベースの復元(T-SQL)

    3. T-SQLを使用してRPC出力を有効にする方法

    4. SqlServerSpatial.dllを読み込めません