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

PostgreSQLがシリーズを間違った方法で組み合わせるのはなぜですか?

    これは、SELECTで呼び出されたときに複数のセットを返す関数がどのように実行されるかという癖です。 -リスト。結果は2つの外積になると期待しますが、それは機能しません。これは実際には、2つの行数の最小公倍数です。

    参照:

    比較:

    test=>     SELECT generate_series(1,3) aval, generate_series(1,4) bval;
     aval | bval 
    ------+------
        1 |    1
        2 |    2
        3 |    3
        1 |    4
        2 |    1
        3 |    2
        1 |    3
        2 |    4
        3 |    1
        1 |    2
        2 |    3
        3 |    4
    (12 rows)
    
    test=>     SELECT generate_series(1,3) aval, generate_series(1,3) bval;
     aval | bval 
    ------+------
        1 |    1
        2 |    2
        3 |    3
    (3 rows)
    

    このため、PostgreSQL 9.2以降では、LATERALを使用する必要があります。 FROMで集合を返す関数を呼び出すクエリ 条項:

    test=>     SELECT aval, bval FROM generate_series(1,3) aval CROSS JOIN LATERAL generate_series(1,3) bval;
     aval | bval 
    ------+------
        1 |    1
        1 |    2
        1 |    3
        2 |    1
        2 |    2
        2 |    3
        3 |    1
        3 |    2
        3 |    3
    (9 rows)
    
    test=>     SELECT aval, bval FROM generate_series(1,3) aval CROSS JOIN LATERAL generate_series(1,4) bval;
     aval | bval 
    ------+------
        1 |    1
        1 |    2
        1 |    3
        1 |    4
        2 |    1
        2 |    2
        2 |    3
        2 |    4
        3 |    1
        3 |    2
        3 |    3
        3 |    4
    (12 rows)
    

    古いバージョンでは、サブクエリインFROMを使用して、SELECT用語に複数のSRFが含まれないようにすることができます。

    test=> SELECT generate_series(1,3) aval, bval FROM (SELECT generate_series(1,4)) AS x(bval);
     aval | bval 
    ------+------
        1 |    1
        2 |    1
        3 |    1
        1 |    2
        2 |    2
        3 |    2
        1 |    3
        2 |    3
        3 |    3
        1 |    4
        2 |    4
        3 |    4
    (12 rows)
    


    1. 参加して複数の条件

    2. Oracle SQL Developerでトリガーを無効にする方法は?

    3. 各IDの最大値を取得するための単純なクエリ

    4. VMwareWorkstationを使用した仮想マシンへのSQLServer2019用のUbuntu18.04のインストール