⇧ IT人材不足してるって話は何だったのか...
IT人材不足って日本だけの話?まぁ、IT人材不足って謳ってる割には、待遇改善されてない気がするけど...
What is UPSERT?
そも、UPSERTとは?
⇧ ということで、MERGEはと言うと、
A 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.
⇧ UPDATEできる時はUPDATEし、INSERTできる時はINSERTするってことらしく、一応、SQL標準になっているそうな。
⇧ 上記がMERGE文ってことだとは思うんだけど、
Database management systems PostgreSQL, Oracle Database, IBM Db2, Teradata, EXASOL, Firebird, CUBRID, H2, HSQLDB, MS SQL, Vectorwise and Apache Derby support the standard syntax. Some also add non-standard SQL extensions.
⇧ 対応してるデータベースが上記で、それ以外は、SQL標準に準拠しておらず、独自のUPSERTを実装してるか、そもそもUPSERTが無いという状態ではあるらしい。
Oracle DatabaseでUPSERTを実現するにはMERGEを使うらしいけど
で、Wikipediaの情報を信じるならば、Oracle Databaseは、一応、SQL標準に則ってるらしいので、MERGE statementが使えるのだと。
ただ、MERGE statementの構造を眺めていて、嫌な予感がしたのだけど、例えば、カラム数がべらぼうに多いテーブルがあった場合、MERGE文を作るの、鬼畜の所業と言わざるを得ない気がするんだけど、自動生成してくれる方法が無いものか。
ちなみに、
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文はシンプルにできそうなのだけど、テーブルのレコードの削除処理はコストが高いので、大量レコードがある場合、時間がかかるというデメリットがあるかと。
どうしても、カラム名を記述せざるを得ない場合は、
⇧ ツールなどで、UPDATE文、INSERT文の雛型を作成して加工してMERGE文を作成していく感じになるんですかね。
何て言うか、
⇧ ノーコードを支えてるのがSQLだとすると、SQLはいつまでたっても自動化されないってことかいな...
本当に自動化されて欲しい部分は一向に自動化されないんよな...
毎度モヤモヤ感が半端ない...
今回はこのへんで。