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

それぞれから1つの列を使用して2つのテーブル関数の結果を比較します

    以下のすべての回答は、行が一致で返されることを前提としています。 注文します。

    Postgres 9.3

    SRF関数から行を分解して同じを返すという風変わりな機能を備えています 並列行数:

    SELECT count(*) AS mismatches
    FROM  (
       SELECT function1('tblp1','tblp2',49) AS f1
            , function2('tblp1_v2','tblp2_v2',49) AS f2
       ) sub
    WHERE  (f1).dist <> (f2).dist;  -- note the parentheses!
    

    行タイプを囲む括弧は、可能なテーブル参照から明確にするために必要です。 マニュアルの詳細はこちら

    返される行の数が同じでない場合、これはデフォルトでデカルト積の行になります(これにより完全に壊れます)。

    Postgres 9.4

    WITH ORDINALITY その場で行番号を生成するには

    WITH ORDINALITYを使用できます その場で行番号を生成し、SELECTのSRF関数の結果のペアリングに依存する必要はありません。 リスト:

    SELECT count(*) AS mismatches
    FROM      function1('tblp1','tblp2',49)       WITH ORDINALITY AS f1(id,dist,rn)
    FULL JOIN function2('tblp1_v2','tblp2_v2',49) WITH ORDINALITY AS f2(id,dist,rn) USING (rn)
    WHERE  f1.dist IS DISTINCT FROM f2.dist;
    

    これは、各関数の同じ行数と異なる数(不一致としてカウントされます)に対して機能します。

    関連:

    ROWS FROM セットを行ごとに結合する

    SELECT count(*) AS mismatches
    FROM   ROWS FROM (function1('tblp1','tblp2',49)
                    , function2('tblp1_v2','tblp2_v2',49)) t(id1, dist1, id2, dist2)
    WHERE  t.dist1 IS DISTINCT FROM t.dist2;
    

    関連する回答:

    余談:
    EXECUTE FORMAT 設定されたplpgsql機能ではありません。 RETURN QUERY は。 format()> クエリ文字列を作成するための便利な関数であり、SQLまたはplpgsqlのどこでも使用できます。



    1. MySQLでインデックスのサイズを把握する方法

    2. JavaJDBCを介したiBATISを使用したOracleSQLDATE変換の問題

    3. 列の値に%signinmysqlが含まれているレコードを検索します

    4. 任意のOracleセッションが使用しているトランザクション分離レベルをどのように確認できますか