前提・実現したいこと
AとBのテーブルから一方のみに存在し、その中で重複があれば他列の古いデータのみと、重複以外のデータを得る、という命題で、略図にすると下記になります。
A TABLE (B TABLEに +Nレコード追加されたものが A TABLEです)
id | xdate | コメント |
---|---|---|
1 | 20190701 | ->A,B両方テーブルに存在するので除外 |
2 | 20190710 | ->idが重複し、最古でないので除外 |
2 | 20190702 | ->このレコードを得たい |
4 | 20190801 | ->このレコードを得たい |
B TABLE
id | xdate | コメント |
---|---|---|
1 | 20190701 | ->A,B両方テーブルに存在するので除外 |
期待する結果
id | xdate | コメント |
---|---|---|
2 | 20190702 | ->id重複の内、xdateが古いレコード |
4 | 20190801 | ->Aにしか無いレコード |
SQL
1SELECT * 2FROM A 3WHERE not exists 4( 5 SELECT * 6 FROM B 7 where A.id=B.id 8)
このSQLで下記の通り A のみ存在するレコードの取得は出来ましたが、idが重複している。
id | date | コメント |
---|---|---|
2 | 20190710 | -> idが重複し最古でないので除外したい |
2 | 20190702 | |
4 | 20190801 |
一方、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 );
で下記の通り取れたのですが、
id | xdate | コメント |
---|---|---|
1 | 20190701 | ->これは B TABLE と重複しているので除外したい |
2 | 20190702 | |
4 | 20190801 |
まとめて1回のSQLで行いたいのですが。。。うまくいきません。
どなたかご教示お願いできませんでしょうか?
重複の定義は、Aidが一致したら?全カラム一致したら?
一方のみに存在はBのみに存在していても抽出するのでしょうか?
もう少しサンプル数を増やして期待する結果を提示してください
できればサンプルはcreate table+insertの形式でお願いします
コードは https://teratail.com/help/question-tips#questionTips3-7 の [コード] に修正してください。
ご回答ありがとうございます。
重複の定義は、下記のとおりです。
1,AテーブルとBテーブルの全カラムが一致しているものは、無条件で重複とするので、除外
2,残ったレコード(対象はAテーブルのみとなります)の内、
Aテーブル内Aidの重複があるものは、最古のxdateのレコードのみ残す。
Bテーブルに+Nレコードが追加されたものがAテーブルという構成なので、
AとBを比較して、Aのみにあるレコードを抽出し、
さらに、その中でAidが重複するものは、最古のレコードのみを、
重複しないものは全てを残す、ということです。
説明が下手ですいません。
また、この質問の場に慣れていなくて、上手に表やコードが上手く書けなくですいません。
よぼよぼの、おっさんをお助け下さい。よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー