※当サイトの記事には、広告・プロモーションが含まれます。

Oracle DatabaseでUPSERTを実現するにはMERGEを使うらしいけど

jbpress.ismedia.jp

⇧ IT人材不足してるって話は何だったのか...

IT人材不足って日本だけの話?まぁ、IT人材不足って謳ってる割には、待遇改善されてない気がするけど...

What is UPSERT?

そも、UPSERTとは?

UPSERTとは、情報技術におけるデータの操作の種類の一つ。データベースソフトウェア等で用いられる。特にSQL文で用いる場合は、MERGE と同じ意味を持つ。

UPSERT - Wikipedia

⇧ ということで、MERGEはと言うと、

relational database management system uses SQL MERGE (also called upsert) statements to INSERT new records or UPDATE existing records depending on whether condition matches. It was officially introduced in the SQL:2003 standard, and expanded in the SQL:2008 standard.

https://en.wikipedia.org/wiki/Merge_(SQL)

⇧ UPDATEできる時はUPDATEし、INSERTできる時はINSERTするってことらしく、一応、SQL標準になっているそうな。

MERGE INTO tablename USING table_reference ON (condition)
  WHEN MATCHED THEN
    UPDATE SET column1 = value1 [, column2 = value2 ...]
  WHEN NOT MATCHED THEN
    INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...]);

https://en.wikipedia.org/wiki/Merge_(SQL)

⇧ 上記がMERGE文ってことだとは思うんだけど、

Database management systems PostgreSQL, Oracle DatabaseIBM Db2TeradataEXASOLFirebirdCUBRIDH2HSQLDBMS SQLVectorwise and Apache Derby support the standard syntax. Some also add non-standard SQL extensions.

https://en.wikipedia.org/wiki/Merge_(SQL)

⇧ 対応してるデータベースが上記で、それ以外は、SQL標準に準拠しておらず、独自のUPSERTを実装してるか、そもそもUPSERTが無いという状態ではあるらしい。

Oracle DatabaseでUPSERTを実現するにはMERGEを使うらしいけど

で、Wikipediaの情報を信じるならば、Oracle Databaseは、一応、SQL標準に則ってるらしいので、MERGE statementが使えるのだと。

ただ、MERGE statementの構造を眺めていて、嫌な予感がしたのだけど、例えば、カラム数がべらぼうに多いテーブルがあった場合、MERGE文を作るの、鬼畜の所業と言わざるを得ない気がするんだけど、自動生成してくれる方法が無いものか。

ちなみに、

stackoverflow.com

I believe the only option you have to avoid using the column names is two separate statements:

delete from USER_COUNTERPARTY UC
      where exists
              (select null
                 from TEMP T
                where T.COUNTER_ID = UC.COUNTER_ID);

insert into USER_COUNTERPARTY UC
  select *
    from TEMP T
   where not exists
           (select null
              from USER_COUNTERPARTY UC
             where T.COUNTER_ID = UC.COUNTER_ID);

https://stackoverflow.com/questions/8944969/how-do-i-merge-two-tables-without-naming-all-columns

⇧ stackoverflowによると、カラム名を書かないで済ます方法は無いっぽいので、MERGE文は諦めろって意見に落ち着いているように見える。

まぁ、確かに、カラム数が100超えるようなテーブルだと、カラム名を記述してくのが苦行と言わざるを得ない。

stackoverflowで紹介されてる方法について、同一の構造のテーブル同士でデータを移行するような場合は、レコードを一旦、削除してからINSERTするのが用意するSQL文はシンプルにできそうなのだけど、テーブルのレコードの削除処理はコストが高いので、大量レコードがある場合、時間がかかるというデメリットがあるかと。

どうしても、カラム名を記述せざるを得ない場合は、

qiita.com

⇧ ツールなどで、UPDATE文、INSERT文の雛型を作成して加工してMERGE文を作成していく感じになるんですかね。

何て言うか、

www.cdata.com

⇧ ノーコードを支えてるのがSQLだとすると、SQLはいつまでたっても自動化されないってことかいな...

本当に自動化されて欲しい部分は一向に自動化されないんよな...

毎度モヤモヤ感が半端ない...

今回はこのへんで。