質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

DB2

DB2(IBM Database2)は、IBMのリレーショナルデータベース管理システム製品です。 UNIXとWindows、IBM社のメインフレームOS用が用意されており、 幅広いプラットフォームに対応しています。

MyBatis

MyBatisはJavaや.NET Frameworkでなどで使用できる、SQL文や、ストアドプロシージャをオブジェクトと紐付けるO/Rマッピングフレームワークです。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

5545閲覧

MERGE文で、UPDATE と INSERT の処理をしたい。

hakujam

総合スコア17

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

DB2

DB2(IBM Database2)は、IBMのリレーショナルデータベース管理システム製品です。 UNIXとWindows、IBM社のメインフレームOS用が用意されており、 幅広いプラットフォームに対応しています。

MyBatis

MyBatisはJavaや.NET Frameworkでなどで使用できる、SQL文や、ストアドプロシージャをオブジェクトと紐付けるO/Rマッピングフレームワークです。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2019/02/26 08:15

編集2019/02/26 08:35

MERGE文で、UPDATE と INSERT の処理をしたい。

MERGE文の USING は、セレクトの結果しか無理なのでしょうか?
※2つのテーブルでのお話?

行いたいことは、そのテーブルに部員コードが存在した場合は、部員の年齢を更新。
存在しない場合は、部員の情報を挿入。

パラメータBUINCDが、存在するかしないかで処理を分けたいのですが、
この場合は、MERGE 文では無理なのでしょうか?

よろしくお願いします。

下記のソースですと、count(*)で無理やりしようとして [SQL0580] となってます。

該当のソースコード

int mergeSCBUIN( @Param("BUINCD") int BUINCD, @Param("BUINNM") String BUINNM, @Param("BUINAG") int BUINAG ); --------------------------------------------- <update id="mergeSCBUIN"> MERGE INTO SCBUINTB A USING (SELECT CASE WHEN COUNT(*)=0 then #{BUINCD} ELSE #{BUINCD} END COUNT) AS BUINCD FROM SCBUINTB WHERE BUINCD=#{BUINCD} ) B ON ( A.BUINCD = B.BUINCD ) WHEN MATCHED THEN UPDATE SET BUINAG=#{BUINAG} WHEN NOT MATCHED THEN INSERT( BUINCD, BUINNM, BUINAG ) VALUES( #{BUINCD}, #{BUINNM}, #{BUINAG} ) </update>

試したこと

補足情報(FW/ツールのバージョンなど)

STS4
JDK11
DB2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2019/02/26 08:27

using部分の例を記述しようとしても内容が不明なので、updateとinsert部分を記述して下さい。
hakujam

2019/02/26 08:35

記述追加してみました。 ありがとうございます。
guest

回答1

0

ベストアンサー

MERGE

MERGE ステートメントは、ソース (表参照の結果) のデータを使用してターゲット (表またはビュー) を更新します。

usingvaluesが使用できればいいんですが、別名が使えないので、表参照の結果を利用する事が出来ません。
なので、ダミーテーブルを使用します。

SQL

1 MERGE INTO SCBUINTB A 2 USING ( 3 SELECT #{BUINCD} as BUINCD, #{BUINNM} as BUINNM, #{BUINAG} as BUINAG 4 FROM SYSIBM.SYSDUMMY1 5 ) B 6 ON (A.BUINCD=B.BUINCD) 7 WHEN MATCHED THEN 8 UPDATE SET BUINAG=B.BUINAG 9 WHEN NOT MATCHED THEN 10 INSERT(BUINCD, BUINNM, BUINAG) 11 VALUES(B.BUINCD, B.BUINNM, B.BUINAG)

環境も無いので、未検証です。悪しからず。

投稿2019/02/26 08:49

sazi

総合スコア25188

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hakujam

2019/02/27 02:04

どうもありがとうございました。おかげ様で意図した動作結果を得ることができました。 ただ、USING のパラメータは、そのままですと、[SQL0418]エラーとなりましたので、 それぞれCASTしました。 CAST(#{BUINCD} as INTEGER) as BUINCD こんな具合にしてOKとなりました。 SYSIBM.SYSDUMMY1 ダミーテーブルも勉強になりました。 感謝です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問