## 疑問点
SQLでデータの取得をしているのですが、上手くデータが取得できなかった部分がありました。
解決はしたのですが、なぜ取得できなかったのかが考えても調べてもわからなかったので質問しました。
テーブル情報
必要なカラムだけ抜粋してます。
itemsテーブル
id | name |
---|---|
10 | A |
11 | B |
12 | C |
item_informationsテーブル
id | item_id |
---|---|
1 | 10 |
2 | 10 |
3 | 11 |
4 | 12 |
やりたいこと
item_informaitonsテーブルのitem_idが重複しているレコード、新規のレコードを別々に取得したい。
重複しているレコード(id: 1,2)のうち、最初のレコード(id: 1)は新規として扱いたい。
以下の様な感じです。
新規 = item_informationsの(id: 1,3,4)のレコード
重複 = item_informationsの(id: 2)のレコード
問題点
新規のレコードの取得は以下のクエリで実現しました。
sql
1SELECT * 2FROM item_informations 3GROUP BY item_id 4ORDER BY id asc
以下のレコードが取得できています。
id | item_id |
---|---|
1 | 10 |
3 | 11 |
4 | 12 |
重複のレコードをクエリを使用して取得しようとして問題が発生しました。
## 問題があったクエリ
sql
1SELECT * 2FROM item_informations 3WHERE id NOT IN ( 4 SELECT id 5 FROM item_informations 6 GROUP BY item_id 7 ORDER BY id asc 8);
サブクエリでは、以下が取得できています。
id | |
---|---|
1 | |
3 | |
4 |
これをサブクエリとして、NOT INで省けば取得できると考えました。
結果として何も取得されず、空の値が返ってきました。
疑問点まとめ
知りたいことは、問題があったクエリでは、なぜデータの取得ができなかったのかです。
憶測ですが、
GROUP BYは重複をまとめるもの。
省いているわけではないので、見えなくても(id: 2)のレコードも含まれている?
だからそのままNOT INで省こうとしたら全てのレコードが省かれたのではないか?
と考えています。
ちなみに、重複のデータ取得に関しては、SQLを使用しない形で解決しております。
解決はしているのですが、理由がわからないままだと今後も同じことをしてしまうと思ったので理由を調べています。
いろいろ調べたのですがこれと言った答えが見つかりませんでした。
初心者の憶測で終わらせてしまうのは心許ないので、理由が分かるかたがいれば回答していただけると幸いです。
回答3件
あなたの回答
tips
プレビュー