ロング トランザクションの一部である SQL ステートメントに問題があります。
UPDATE tab_1
LEFT JOIN tab_2
ON tab_1.id = tab_2.tab_1_id
SET tab_1.something = 42
WHERE tab1.id = tab_2.tab_1_id;
すべてが単純で、tab_1 と tab_2 がデータベースに存在する限り正常に動作します。これは明らかです。;-)
問題は、トランザクションを 4 つの異なるサーバーでコミットする必要があり、tab_2 が「動的」テーブルであり、特定の db / db スキーマに存在する場合と存在しない場合があることです...
tab_2 が存在しない場合、データベースは例外をスローし、トランザクション全体はコミットされません。とにかく続行したいです(0行を更新するだけです)!
私はこのようなことを試しました:
UPDATE [all the same as above] WHERE tab1.id = tab_2.tab_1_id AND EXISTS (select 1 from pg_class where relname='tab_2');
...しかし、「例外チェック」は「where」条件の前に行われるため、まだ間違っています (結合で使用したいテーブルと同じです..)。
「純粋な」SQLでこれを行う方法はありますか? :)
次のようなもの: LEFT JOIN tab_2 IF tab_2 EXISTS (そうでない場合 - 何もしない、null を返すなど?)
pl/pgsql プロシージャでこれを行う方法があることは知っています。2 番目の可能性は、テーブルが存在しない場合は、ステートメントの前に作成することです。
しかし、これを 1 つのステートメントで行う簡単でエレガントな方法があるのではないでしょうか? :)
DBMS: PostgreSQL 9.2