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

SQLでのWITH句の使用に関するガイダンス

    同時書き込みアクセスが可能な場合 関連するテーブルに対して、次のクエリには競合状態があります。検討してください:

    あなたの例はできます CTE(共通テーブル式)を使用しますが、サブクエリで実行できなかったものは何もありません:

    WITH x AS (
       SELECT  psp_id
       FROM    global.prospect
       WHERE   status IN ('new', 'reset')
       ORDER   BY request_ts
       LIMIT   1
       )
    UPDATE global.prospect psp
    SET    status = status || '*'
    FROM   x
    WHERE  psp.psp_id = x.psp_id
    RETURNING psp.*;
    

    返される行は更新されます バージョン。

    場合 返された行を別のテーブルに挿入したい場合は、そこでWITH 条項が不可欠になります:

    WITH x AS (
       SELECT  psp_id
       FROM    global.prospect
       WHERE   status IN ('new', 'reset')
       ORDER   BY request_ts
       LIMIT   1
       )
    , y AS (
       UPDATE global.prospect psp
       SET    status = status || '*'
       FROM   x
       WHERE  psp.psp_id = x.psp_id
       RETURNING psp.*
       )
    INSERT INTO z
    SELECT *
    FROM   y;
    

    CTEを使用したデータ変更クエリはPostgreSQL9.1で追加されました。
    WITHに関するマニュアル クエリ(CTE)。



    1. カーソルを使用せずにSQLで現在の合計を計算するにはどうすればよいですか?

    2. Oracle CloudPlatformでのMySQLデータベースサービスでのOracleJDeveloperの使用、パート3

    3. MysqlGroup24時間間隔

    4. AES_ENCRYPTを正しく使用する方法は?