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

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

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

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

SQL

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

Q&A

解決済

4回答

3915閲覧

同じ列構成のテーブルを比較し、追加もしくは差異があるデータに対して処理を行いたい

ARATAITE

総合スコア4

Oracle Database

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

SQL

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

0グッド

0クリップ

投稿2020/01/28 01:49

編集2020/01/28 04:28

前提・実現したいこと

Oracle DBにて2つの同じ列を持つテーブルを比較し、追加もしくは差分がある場合、フラグを立てる処理を行いたい。
削除された場合を考慮する必要はなく、追加と差分は同じ動作としたい。

テーブル例

テーブルA
|No|Data_A|Data_B|Data_C|FLAG|
|:--|:--:|--:|0|
|1|AAA|AAA|AAA|0|
|2|BBB|ZZZ|BBB|0|
|3|CCC|CCC|ZZZ|0|
|4|DDD|DDD|DDD|0|

テーブルB
|No|Data_A|Data_B|Data_C|FLAG|
|:--|:--:|--:|
|1|AAA|AAA|AAA|0
|2|BBB|BBB|BBB|0
|3|CCC|CCC|CCC|0

処理後のテーブルA
|No|Data_A|Data_B|Data_C|FLAG|
|:--|:--:|--:|0|
|1|AAA|AAA|AAA|0|
|2|BBB|ZZZ|BBB|1|
|3|CCC|CCC|ZZZ|1|
|4|DDD|DDD|DDD|1|

CREATE TABLE TableA( No NUMBER(12) DEFAULT 0 NOT NULL, primary key(No), Data_A VARCHAR2(100), Data_B VARCHAR2(100), Data_C VARCHAR2(100), FLAG VARCHAR2(1)); COMMENT ON COLUMN TableA.No IS '主キー'; COMMENT ON COLUMN TableA.Data_A IS 'データA'; COMMENT ON COLUMN TableA.Data_B IS 'データB'; COMMENT ON COLUMN TableA.Data_C IS 'データC'; COMMENT ON COLUMN TableA.FLAG IS 'フラグ(0 or 1)'; CREATE TABLE TableB( No NUMBER(12) DEFAULT 0 NOT NULL, primary key(No), Data_A VARCHAR2(100), Data_B VARCHAR2(100), Data_C VARCHAR2(100), FLAG VARCHAR2(1)); COMMENT ON COLUMN TableB.No IS '主キー'; COMMENT ON COLUMN TableB.Data_A IS 'データA'; COMMENT ON COLUMN TableB.Data_B IS 'データB'; COMMENT ON COLUMN TableB.Data_C IS 'データC'; COMMENT ON COLUMN TableB.FLAG IS 'フラグ(0 or 1)'; Insert into TableA VALUES('1','AAA','AAA','AAA','0'); Insert into TableA VALUES('2','BBB','ZZZ','BBB','0'); Insert into TableA VALUES('3','CCC','CCC','ZZZ','0'); Insert into TableA VALUES('4','DDD','DDD','DDD','0'); Insert into TableB VALUES('1','AAA','AAA','AAA','0'); Insert into TableB VALUES('2','BBB','BBB','BBB','0'); Insert into TableB VALUES('3','CCC','CCC','CCC','0');

試したこと

minusを用いることで差分と追加分を取得できることは分かるのですが、UPDATEと組み合わせた場合の処理がわからないためご教示お願いします。

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

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

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

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

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

Orlofsky

2020/01/28 02:08

せめて、テーブル定義はCREATE TABLE で提示しては?
guest

回答4

0

自己解決

ひとまず下記の2つのUpdateで希望通りの動作となったため解決とします。

--差分用 Update TableA A Set flag = ( Select 1 From TableB B Where A.no = B.no AND (A.data_a <> B.data_a OR A.data_b <> B.data_b OR A.data_c <> B.data_c)) Where exists (Select 1 From TableB B Where A.no = B.no AND (A.data_a <> B.data_a OR A.data_b <> B.data_b OR A.data_c <> B.data_c)); --追加用 Update TableA Set flag = 1 Where No in (Select No From TableA Minus Select No From TableB);

投稿2020/01/28 07:30

ARATAITE

総合スコア4

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

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

0

MERGE を使っては?

投稿2020/01/28 02:58

Orlofsky

総合スコア16415

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

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

sazi

2020/01/28 04:00

Insert要件はなさそうですが?
Orlofsky

2020/01/28 04:36

insertはしないでupdateだけ。
sazi

2020/01/28 05:27

敢えてそのようなオーバーヘッドを持ち込まない方が良いと思うのですが。
guest

0

SQL 入門 (DMLの基本形式:UPDATE)
※ビューを使った更新(インラインビューを使った更新) を参照
以下引用

SQL

1UPDATE ( 2 SELECT 3 DEPT_NO, USER_NAME 4 FROM USER_MASTER 5 WHERE DEPT_NO = '1002' 6) -- [ ビューの別名 ] 7SET 8 USER_NAME = USER_NAME || ' 氏', 9 MODIFIED_ON = SYSDATE 10 /* 11 WHERE 12 DEPT_NO = '1002' 13 */

minusを用いることで差分と追加分を取得できることは分かる

上記部分をビューの部分で使用すれば良いことになります。

単純にテーブルBの有無だけでフラグセットするなら、サブクエリーを条件にするのが効率的だと思います。

SQL

1update テーブルA set フラグ=1 2where 主キー in (select 主キー from テーブルB)

追記

SQL

1update TableA A set flg=1 2where not exsis ( 3 Select 1 From TableB B 4 Where A.no = B.no 5 AND A.data_a = B.data_a 6 and A.data_b = B.data_b 7 and A.data_c = B.data_c 8 )

投稿2020/01/28 01:57

編集2020/01/28 09:52
sazi

総合スコア25188

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

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

ARATAITE

2020/01/28 05:21

回答ありがとうございます。 MINUSで差分を取得した後、TableAのNoと差分データのNoで紐づくTableAのFLAGに1をしたいのですが、下記ではダメでした。 UPDATE ( SELECT No,Data_A,Data_B,Data_C FROM TABLEA MINUS SELECT No,Data_A,Data_B,Data_C FROM TABLEB )TMP SET TableA.FLAG=1 WHERE TableA.No=TMP.No;
sazi

2020/01/28 05:31 編集

駄目とは?シンタックスエラーじゃないですか? where条件のtableA.Noなどは参照できないのでエラーなります。 where条件はビュー内に含めて下さい。 目的を果たすには、回答の2番目のSQLで十分だと思います。
ARATAITE

2020/01/28 07:43

SQLは目下勉強中でどういった理由でエラーとなっているのかが分からず、曖昧なまま記載してしまいました。以後気を付けます。 2番目のSQLではNo2,3,4ではなく、No1,2,3のフラグが立つため、目的通りの動作となりませんでした。
sazi

2020/01/28 09:53

多分SQL1文で行けると思いますので、追記しておきます。
guest

0

取得したものをEXISTSで条件句に指定すればUPDATEできるのでは?

投稿2020/01/28 01:56

workaholist

総合スコア559

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問