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

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

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

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

SQL

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

Q&A

解決済

2回答

2544閲覧

ORACLEでINSERT ALL INTO ~ SELECT ~ 文を使うとき、SELECT文の結果が複数の場合

saitoh0w0

総合スコア11

Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

SQL

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

0グッド

0クリップ

投稿2022/04/14 08:10

前提

ORACLEで複数のレコードをINSERTしたいのですが、以下のクエリを実行したら一意制約エラーが出てしまいました。
(INSERT先「TABLE_01」のプライマリーキーは、COL_01列と固定値が入る列からなります)
SELECT文結果のCOL_01列は一意になっており、固定値もINSERT先には存在しない値なので、問題ないように思えるのですが…
解決策として、

INSERT INTO TABLE_01
SELECT
table2.COL_01, table2.COL_02 ,table2.COL_03, '固定値1'
FROM TABLE_02
INNER JOIN TABLE_01 table1 ON (
table2.COL_01= table1.COL_01
)
GROUP BY table2.COL_01, table2.COL_02 ,table2.COL_03

を固定値の数だけ実行し続けるというのが浮かびましたが、いかんせん固定値の種類が大量にある上に実際のSELECT文はもっと長いので、無駄がある気がしています。

実現したいこと

一意制約エラーを解消した上で、なるべくすっきりとしたクエリでINSERT文を実行したいです。
よろしくお願いいたします。

発生している問題・エラーメッセージ

ORA-00001: unique constraint (プライマリーキー名) violated

該当のソースコード

ORACLE

1INSERT ALL 2INTO TABLE_01 VALUES (COL_01, COL_02, COL_03, '固定値1') 3INTO TABLE_01 VALUES (COL_01, COL_02, COL_03, '固定値2') 4SELECT 5 table2.COL_01, table2.COL_02 ,table2.COL_03 6FROM 7 TABLE_02 table2 8INNER JOIN TABLE_01 table1 ON ( 9 table2.COL_01= table1.COL_01 10) 11GROUP BY table2.COL_01, table2.COL_02 ,table2.COL_03

試したこと

TABLE_01と同構造でプライマリーキーを持たないテーブルに対しては正常に動作しました。

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

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

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

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

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

saitoh0w0

2022/04/14 08:50 編集

一意制約エラーはTABLE_01のレコードが原因でした。
saitoh0w0

2022/04/14 08:51

修正依頼ありがとうございます。 はい、その通りでして、テーブルのデータが原因でした。自己解決いたしました。。。
guest

回答2

0

自己解決

自己解決いたしました。
テスト環境のTABLE_01に「固定値1」「固定値2」を含むレコードが既に存在していることが原因でした。
実際にSQLを実行する環境ではそのようなことが起こらず、適当な文字列の固定値でクエリを試したところ通りましたので、これでよしとしたいと思います。

投稿2022/04/14 08:53

saitoh0w0

総合スコア11

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

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

0

グループ化して条件を指定するHAVING

SQL

1SELECT ... HAVING COUNT(*) > 1;

でダブっているデータを確認しては?

投稿2022/04/14 08:52

Orlofsky

総合スコア16415

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問