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

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

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

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

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

SQL

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

Q&A

解決済

2回答

6000閲覧

2つのテーブルのカラム値を比較して、一致しないカラムが含まれたレコードをインサート

raccoondog

総合スコア77

Oracle Database

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

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

SQL

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

0グッド

0クリップ

投稿2018/12/21 04:50

編集2018/12/21 05:30

※修正前の質問
INPUT_TEST_001とINPUT_TEST_002のテーブルを比較して
一致しないカラムが含まれているレコードをINPUT_TEST_003にインサートさせたいです

※修正後の質問
INPUT_TEST_001、INPUT_TEST_002、INPUT_TEST_003には同じカラムがあります。

INPUT_TEST_003とINPUT_TEST_002のカラム値を比較して、INPUT_TEST_002だけに存在するカラム値を抽出(=カラム値A)

カラム値Aと同値が含まれるINPUT_TEST_001のレコードをINPUT_TEST_003へインサートさせたい

※検証中のSQL SQL> insert into INPUT_TEST_003 2 select * 3 from INPUT_TEST_001 A 4 where not exists ( 5 select * 6 from INPUT_TEST_001 A, INPUT_TEST_002 B 7 where A.NUM = B.NUM 8 ); 0行が作成されました。 ※テーブルの情報 SQL> select count(*) from INPUT_TEST_001; COUNT(*) ---------- 10010 SQL> select count(*) from INPUT_TEST_002; COUNT(*) ---------- 10010 SQL> select count(*) from INPUT_TEST_003; COUNT(*) ---------- 0 ※一致するレコード情報 SQL> select 2 A1.BANGOU,A1.NUM,A1.STR 3 from 4 INPUT_TEST_001 A1,INPUT_TEST_002 B1 5 where 6 A1.NUM = B1.NUM; BANGOU NUM STR ---------- ---------- ---------------- 3127 67659843 ACOELDJZ 5570 87810870 TUIZGXGF ※テーブル定義は3つとも同じ 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- BANGOU NOT NULL NUMBER(8) NUM NUMBER(12,2) STR CHAR(8) VARSTR VARCHAR2(8) DT DATE TIME0 TIMESTAMP(0) TIME6 TIMESTAMP(6) TIME9 TIMESTAMP(9)

想定では2レコード分がINPUT_TEST_003へインサートされるはずが失敗中です。

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

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

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

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

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

Orlofsky

2018/12/21 05:00

テーブル定義はCREATE TABLEに、テーブルに存在するデータはINSERTに変更してください。どう失敗したかも追記しては?
raccoondog

2018/12/21 05:30

ご指摘有難うございます。
guest

回答2

0

ベストアンサー

上手く行かないのは、サブクエリー内でINPUT_TEST_001を参照していて、相関になっていないから。
1.INPUT_TEST_001にしか存在しない場合

SQL

1insert into INPUT_TEST_003 2select * from INPUT_TEST_001 A 3where not exists ( 4 select 1 from INPUT_TEST_002 B where A.NUM=B.NUM 5 )

2.両方に存在する場合、

SQL

1insert into INPUT_TEST_003 2select * from INPUT_TEST_001 A 3where exists ( 4 select 1 from INPUT_TEST_002 B where A.NUM=B.NUM 5 )

※ただ、キーが同じであれば内容も同じという前提でなければ、用途を満たさないのではないかと思われる。

3.何れか一方にしか存在しないものという事なら、

SQL

1insert into INPUT_TEST_003 2select * from INPUT_TEST_001 A 3where not exists ( 4 select 1 from INPUT_TEST_002 B where A.NUM=B.NUM 5 ) 6union all 7select * from INPUT_TEST_002 A 8where not exists ( 9 select 1 from INPUT_TEST_001 B where A.NUM=B.NUM 10 )

※但し、どちらに存在しているかの情報が無いけど良いんだろうか、という点

追記

SQL

1insert into INPUT_TEST_003 2select * from INPUT_TEST_001 3where Num In ( 4 select Num from INPUT_TEST_002 A where not exists(select 1 from INPUT_TEST_003 B where A.NUM=B.NUM) 5 )

投稿2018/12/21 04:58

編集2018/12/21 06:10
sazi

総合スコア25173

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

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

raccoondog

2018/12/21 05:31

ご回答有難うございます。非常にたすかります。 私の認識違いがありまして、質問内容を更新させて頂きました。
sazi

2018/12/21 05:37

2のパターンって事ですね。
raccoondog

2018/12/21 05:47

2のパターンですと、INPUT_TEST_001とINPUT_TEST_002のNUM比較となりますので INPUT_TEST_002とINPUT_TEST_003を比較して、INPUT_TEST_002だけに存在するカラム値を抽出条件としたいです
sazi

2018/12/21 05:49

キー以外の全カラムの比較という事ですか?
raccoondog

2018/12/21 05:53

INPUT_TEST_002とINPUT_TEST_003のキー値(NUM)だけになります。 INPUT_TEST_002だけにあるNUM値を抽出 INPUT_TEST_001のNUM値で該当するレコードをINPUT_TEST_003へインサート となります。
sazi

2018/12/21 05:56

「INPUT_TEST_002だけにあるNUM値を抽出」ということなら「INPUT_TEST_001のNUM値で該当するレコード」は存在しないので、INPUT_TEST_001のデータを追加することはできませんが?
sazi

2018/12/21 05:58

ああ、「INPUT_TEST_003とINPUT_TEST_002」を比較して存在しない場合は、「INPUT_TEST_001のデータを追加」という事ですか
raccoondog

2018/12/21 06:08

「INPUT_TEST_003とINPUT_TEST_002のNUM列」を比較して、 「INPUT_TEST_002だけにあるNUM値」を抽出 「INPUT_TEST_001から抽出したNUM値を含むレコードをINPUT_TEST003へインサート」 になります
raccoondog

2018/12/21 07:43

大変助かりました。 有難うございました。
guest

0

SQL

1select * 2from INPUT_TEST_001 A 3where not exists ( 4select * 5from INPUT_TEST_001 A, INPUT_TEST_002 B 6where A.NUM = B.NUM 7);

で2レコード分がSELECTされるかも確認しましょう。

投稿2018/12/21 05:03

Orlofsky

総合スコア16415

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

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

sazi

2018/12/21 05:06

いや、それ相関になってないっす。。
Orlofsky

2018/12/21 05:58

それを理解してもらわないと、先に進めないでしょう。
sazi

2018/12/21 06:10

ああ、そういう意図でしたか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問