忘れっぽいエンジニアのオラクル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があったんで、参考にして作ったSQLをPostgreSQLで実行してみたら、
ってなエラーが出ました。
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拡張機能を使用するアプリケーションを移植する時は注意してください。