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

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

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

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

Q&A

解決済

1回答

2117閲覧

[mysql]一方のみ存在し、結果内で重複時は他列が最古の物と重複以外の取得方法

qaqaqa

総合スコア9

MySQL

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

0グッド

0クリップ

投稿2019/08/07 10:00

編集2019/08/07 14:48

前提・実現したいこと

AとBのテーブルから一方のみに存在し、その中で重複があれば他列の古いデータのみと、重複以外のデータを得る、という命題で、略図にすると下記になります。

A TABLE (B TABLEに +Nレコード追加されたものが A TABLEです)

idxdateコメント
120190701->A,B両方テーブルに存在するので除外
220190710->idが重複し、最古でないので除外
220190702->このレコードを得たい
420190801->このレコードを得たい

B TABLE

idxdateコメント
120190701->A,B両方テーブルに存在するので除外

期待する結果

idxdateコメント
220190702->id重複の内、xdateが古いレコード
420190801->Aにしか無いレコード

SQL

1SELECT * 2FROM A 3WHERE not exists 4( 5 SELECT * 6 FROM B 7 where A.id=B.id 8)

このSQLで下記の通り A のみ存在するレコードの取得は出来ましたが、idが重複している。

iddateコメント
220190710-> idが重複し最古でないので除外したい
220190702
420190801

一方、A 内の重複で最古のレコードは、(不等号記号で最古?変では?)

SQL

1select * from A as t1 2where not exists 3( select 1 from A as t2 4where t1.id=t2.id 5and t1.xdate > t2.xdate );

で下記の通り取れたのですが、

idxdateコメント
120190701->これは B TABLE と重複しているので除外したい
220190702
420190801

まとめて1回のSQLで行いたいのですが。。。うまくいきません。
どなたかご教示お願いできませんでしょうか?

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

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

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

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

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

yambejp

2019/08/07 10:17 編集

重複の定義は、Aidが一致したら?全カラム一致したら? 一方のみに存在はBのみに存在していても抽出するのでしょうか? もう少しサンプル数を増やして期待する結果を提示してください できればサンプルはcreate table+insertの形式でお願いします
qaqaqa

2019/08/07 13:41

ご回答ありがとうございます。 重複の定義は、下記のとおりです。 1,AテーブルとBテーブルの全カラムが一致しているものは、無条件で重複とするので、除外 2,残ったレコード(対象はAテーブルのみとなります)の内、  Aテーブル内Aidの重複があるものは、最古のxdateのレコードのみ残す。 Bテーブルに+Nレコードが追加されたものがAテーブルという構成なので、 AとBを比較して、Aのみにあるレコードを抽出し、 さらに、その中でAidが重複するものは、最古のレコードのみを、 重複しないものは全てを残す、ということです。 説明が下手ですいません。 また、この質問の場に慣れていなくて、上手に表やコードが上手く書けなくですいません。 よぼよぼの、おっさんをお助け下さい。よろしくお願いいたします。
guest

回答1

0

ベストアンサー

今提示されている条件が本当に全てであれば以下で行けるはずです。
とにかくサンプル数が少なすぎて検証できません

元データ

SQL

1create table tbl_a(id int,xdate date); 2insert into tbl_a values(1,'20190701'),(2,'20190710'),(2,'20190702'),(4,'20190801'); 3 4create table tbl_b(id int,xdate date); 5insert into tbl_b values(1,'20190701');
  • 抽出

tbl_aの最小日付のデータを抽出し、そこからtbl_bのidを除外

SQL

1 2select * from tbl_a as t1 3where not exists(select 1 from tbl_a where id=t1.id and xdate<t1.xdate) 4and not exists(select 1 from tbl_b where id=t1.id)

投稿2019/08/08 00:47

yambejp

総合スコア114585

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

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

qaqaqa

2019/08/08 03:07

ご回答ありがとうございます! 教えいただいたSQLで問題ございません。 not ewxit を and で接続するんですね、そんな発想はなかったです!勉強になります。 大変お手数おかけしました。本当にありがとうございます。 助けられたんので、私も誰かを助けられるよう精進してまいります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問