S_a_k_Uの日記みたいなDB

~サクゥーと呼ばないで~

SELECTの結果でUPDATE

忘れっぽいエンジニアのオラクルSQLリファレンス
SELECTで取得した値でUPDATEする
の下の方に、

 update
  emp ep
 set (dept_name, dept_etc) = (
  select dp.dept_name, dp.dept_etc
  from dept dp
  where ep.dept_id = dp.dept_id )

ってな感じのSQLがあったんで、参考にして作ったSQLPostgreSQLで実行してみたら、

ERROR: syntax error at or near "select"

ってなエラーが出ました。
PostgreSQL複数項目のUpdateはできんのかと思ったら、
SELECT結果でUPDATE
の書き方で、上記のSQLを書き換えるとこんな感じになるみたい。

 update
  emp
 set
    dept_name = dp.dept_name
    , dept_etc = dp.dept_etc
  from
    (
    select
        dept_name
        , dept_etc
        , dept_id
    from dept
    ) as dp
  where
    emp.dept_id = dp.dept_id

どっちが標準SQLなんだか???って思って調べてみたら、PostgreSQLの方が標準に準拠してないってことらしい。

このコマンドは標準SQLに準拠しています。ただしFROM句およびRETURNING句はPostgreSQLの拡張です。

標準に従うと、列リスト構文は、副選択のような単一の行値式から代入される列のリストを許可しなければなりません。

UPDATE accounts SET (contact_last_name, contact_first_name) =
    (SELECT last_name, first_name FROM salesmen
     WHERE salesmen.id = accounts.sales_id);

これは現時点ではサポートされていません。ソースは独立した式でなければなりません。

他のデータベースシステムには、FROMオプション内で、対象テーブルが再度指定されることを前提として動作するものもあります。これはPostgreSQLにおけるFROMの解釈方法とは異なります。 FROM拡張機能を使用するアプリケーションを移植する時は注意してください。