質問: ### 前提・実現したいこと JavaからDBのデータを抽出する際、2つのテーブルから対象のカラムを比べて条件に沿わないもののデータをすべて抽出したい。 ### 実現したいことの例 ``` テーブルA カラムD(Date) カラムE(numeric(12,2)) カラムF(varchar(20)) カラムG(varchar(20)) カラムH(varchar(20)) カラムI(varchar(20)) テーブルB カラムD(Date) カラムE(numeric(12,2)) カラムF(varchar(20)) カラムJ(varchar(20)) カラムK(varchar(20)) ``` カラムD、E、FをテーブルAとBで比較する。 (カラムFは前11桁を比較します) 合致したものがないデータをA、Bともに抽出したい。 D、E、Fはユニークではありません。 ですので、同一のものが複数存在する場合があります。 複数存在しても、その数があっていない場合余りを抽出するのは変わりません。 ### 試したこと Javaの処理で行ったが、処理に時間がかかりデータを抽出する際にできるように変更 ### 補足情報 使用言語:Java QueryDsl等使用 ### 最後に 拙い日本語で申し訳ありません。 不明な点があれば、一言よろしくお願いいたします。
回答: テーブルA、Bのサンプルを追記して下さい。 それぞれのテーブルにはDEFしかカラムがないのでしょうか? またDEFはテーブルA、Bの中ではユニークなのでしょうか? 考え方だけ DEFをテーブルABそれぞれにDISTINCTで抽出してUNION ALLし group byしてhavingでcount(*)が1のデータを抽出するといいでしょう sample ======= ``` create table tbl_a(id int unique ,D int,E int, F int, G varchar(10)); insert into tbl_a values(1,100,100,100,'aaa'),(2,200,200,200,'bbb'),(3,100,200,100,'ccc'),(4,100,100,100,'ddd'); create table tbl_b(id int unique ,D int,E int, F int, H varchar(10)); insert into tbl_b values(101,100,100,100,'eee'),(102,200,100,200,'fff'),(103,200,200,200,'ggg'),(104,200,100,200,'hhh'); ``` * 片方にしかないDEF ``` select D,E,F from( select distinct D,E,F from tbl_a union all select distinct D,E,F from tbl_b ) as sub group by D,E,F having count(*)=1 ``` * それぞれ合致するデータを抽出 ``` /* tbl_a */ select * from tbl_a where (D,E,F) in ( select D,E,F from( select distinct D,E,F from tbl_a union all select distinct D,E,F from tbl_b ) as sub group by D,E,F having count(*)=1 ); /* tbl_b */ select * from tbl_b where (D,E,F) in ( select D,E,F from( select distinct D,E,F from tbl_a union all select distinct D,E,F from tbl_b ) as sub group by D,E,F having count(*)=1 ); ``` ※注意:命題の追記をみるかぎり、tbl_aとtbl_bは構成が違うようなので 一発でデータ抽出はできません。二度にわけて処理して下さい