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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

DB2

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

Q&A

解決済

1回答

1532閲覧

DB:別のテーブルから漏れを確認し、抽出する

maihama

総合スコア17

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

DB2

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

0グッド

0クリップ

投稿2017/11/06 01:28

編集2017/11/06 02:02

###前提・実現したいこと
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等使用

###最後に
拙い日本語で申し訳ありません。
不明な点があれば、一言よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

テーブルA、Bのサンプルを追記して下さい。
それぞれのテーブルにはDEFしかカラムがないのでしょうか?
またDEFはテーブルA、Bの中ではユニークなのでしょうか?

考え方だけ
DEFをテーブルABそれぞれにDISTINCTで抽出してUNION ALLし
group byしてhavingでcount(*)が1のデータを抽出するといいでしょう

sample

SQL

1create table tbl_a(id int unique ,D int,E int, F int, G varchar(10)); 2insert into tbl_a values(1,100,100,100,'aaa'),(2,200,200,200,'bbb'),(3,100,200,100,'ccc'),(4,100,100,100,'ddd'); 3create table tbl_b(id int unique ,D int,E int, F int, H varchar(10)); 4insert into tbl_b values(101,100,100,100,'eee'),(102,200,100,200,'fff'),(103,200,200,200,'ggg'),(104,200,100,200,'hhh'); 5
  • 片方にしかないDEF

SQL

1select D,E,F from( 2select distinct D,E,F from tbl_a 3union all select distinct D,E,F from tbl_b 4) as sub 5group by D,E,F 6having count(*)=1
  • それぞれ合致するデータを抽出

SQL

1/* tbl_a */ 2select * from tbl_a 3where (D,E,F) in ( 4select D,E,F from( 5select distinct D,E,F from tbl_a 6union all select distinct D,E,F from tbl_b 7) as sub 8group by D,E,F 9having count(*)=1 10); 11 12/* tbl_b */ 13select * from tbl_b 14where (D,E,F) in ( 15select D,E,F from( 16select distinct D,E,F from tbl_a 17union all select distinct D,E,F from tbl_b 18) as sub 19group by D,E,F 20having count(*)=1 21);

※注意:命題の追記をみるかぎり、tbl_aとtbl_bは構成が違うようなので
一発でデータ抽出はできません。二度にわけて処理して下さい

投稿2017/11/06 01:47

編集2017/11/06 02:38
yambejp

総合スコア114572

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

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

maihama

2017/11/06 02:03

yambejpさん ありがとうございます。加筆修正いたしました。 COUNTが1を抽出する理由を教えていただけないでしょうか?
yambejp

2017/11/06 02:14

ABそれぞれにDISTINCTして抽出すると、 片方にしかデータがなければcount(*)は1 両方にデータがあればcount(*)は2になります
maihama

2017/11/06 02:20

yambejpさん ありがとうございます。同一データが複数あった場合はどのような対応をしたらよろしいでしょうか。
yambejp

2017/11/06 02:39

sample追記しておきました。 見やすくするためだいぶ省略していますが、イメージはつかめると思います
maihama

2017/11/06 02:42

yambejpさん ご丁寧にSampleまでありがとうございます。これをもとに一度やってみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問