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

共通テーブル式のINSERTで使用される副選択からデータを返す

    テーブル名とエイリアスを正しく取得する必要があります。さらに、2つのテーブル間の接続は列 imageです。 (データ 新しいテーブルfile_data ):

    WITH inserted AS (
      INSERT INTO file_data (data)
      SELECT image
      FROM   task_log
      WHERE  image IS NOT NULL
      RETURNING id, data  -- can only reference target row
    )
    UPDATE task_log t
    SET    attachment_id = i.id
         , attachment_type = 'INLINE_IMAGE'
    FROM   inserted i
    WHERE  t.image = i.data;
    

    あなたが参照した私の古い答えで説明されているように、 image task_logで一意である必要があります これが機能するために:

    参照された回答の一意でない値を明確にする方法を追加しました。 file_dataに重複する画像が必要かどうかわからない 、しかし。

    RETURNING INSERTの句 挿入された行からのみ列を参照できます。 マニュアル:

    大胆な強調鉱山。

    重複するソース値を折りたたむ

    INSERTのターゲットテーブルに個別のエントリが必要な場合 ( task_log )、この場合に必要なのは DISTINCTだけです 最初のSELECTで :

    WITH inserted AS (
      INSERT INTO file_data (data)
      SELECT DISTINCT image  -- fold duplicates
      FROM   task_log
      WHERE  image IS NOT NULL
      RETURNING id, data  -- can only reference target row
    )
    UPDATE task_log t
    SET    attachment_id = i.id
         , attachment_type = 'INLINE_IMAGE'
    FROM   inserted i
    WHERE  t.image = i.data;
    

    結果のfile_data.id task_logで複数回使用されています 。 task_logの複数の行に注意してください file_data内の同じ画像を指すようになりました 。更新と削除に注意してください...



    1. 括弧のある場合とない場合のUNIONALLの動作が異なるのはなぜですか?

    2. mysqlclientをインストールできません

    3. 空のフィールドを無視して1つ以上のフィールドをmysqlデータベースに更新する方法は?

    4. php/mysqlアカウントのアクティブ化