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

1つのPostgreSQLクエリで複数のWITHステートメントを使用するにはどうすればよいですか?

    他のコメントによると、2番目の共通テーブル式[CTE]の前には、WITHステートメントではなくコンマが付いているので

    WITH cte1 AS (SELECT...)
    , cte2 AS (SELECT...)
    SELECT *
    FROM
        cte1 c1
        INNER JOIN cte2 c2
        ON ........
    

    実際のクエリに関しては、この構文はPostgreSql、Oracle、およびsql-serverで機能するはずです。後で通常は、WITHに進みます。 セミコロン付き(;WTIH )、しかしそれは通常、SQLサーバーの人々(私自身を含む)が、CTEが定義される前に終了する必要がある以前のステートメントを終了しないためです...

    ただし、WHEREに関して2番目の構文の問題があったことに注意してください。 声明。 WHERE date IN table_2 table_2から値/列を実際に参照することはないため、は無効です。 INNER JOINが好きです IN以上 またはExists したがって、JOINで機能する構文を次に示します。 :

    WITH table_1 AS (
    SELECT GENERATE_SERIES('2012-06-29', '2012-07-03', '1 day'::INTERVAL) AS date
    )
    
    , table_2 AS (
    SELECT GENERATE_SERIES('2012-06-30', '2012-07-13', '1 day'::INTERVAL) AS date
    )
    
    SELECT * 
    FROM
         table_1 t1
         INNER JOIN 
         table_2 t2
         ON t1.date = t2.date
    ;
    

    通常は存在する状態を維持したい場合は、INよりも優れていますが、INを使用するには、場所に実際のSELECTステートメントが必要です。

    SELECT * 
    FROM
         table_1 t1
    WHERE t1.date IN (SELECT date FROM table_2);
    

    dateの場合、INは非常に問題があります NULLである可能性があります したがって、JOINを使用したくない場合 次に、EXISTSを提案します 。 ASは次のとおりです:

    SELECT * 
    FROM
         table_1 t1
    WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);
    


    1. MySQLのバイナリデータ

    2. RefCursorの戻り型を使用してOracleストアドプロシージャをテストするにはどうすればよいですか?

    3. CRYPT_GEN_RANDOM()を使用して、SQLServerで暗号化されたランダム番号を作成します

    4. PostgreSQLで2つの日付間の時系列を生成する