小ネタ。
特定の条件に一致するレコードを取得するのはINNER JOIN
等を使う方法は知ってましたが、一致しないレコードを取得する方法を知らなかったのでメモします。
環境
- MySQL
- 8
実装
NOT EXISTS
を使えば条件一致しないレコードを特定できます。逆に条件一致するレコードを調べるときはEXISTS
を使えば特定できます。
SELECT * FROM users WHERE NOT EXISTS(SELECT 1 FROM user_profiles WHERE users.id = user_profiles.id)
検証方法
USERS
テーブルとUSER_PROFILES
テーブルを用意します。関連を1:0...1
にします。このときに関連がないUSERS
テーブルの4, 5を取得できれば検証完了です。
CREATE TABLE users ( id INTEGER NOT NULL ); CREATE TABLE user_profiles ( id INTEGER NOT NULL, user_id INTEGER ); INSERT INTO users (id) value (1), (2), (3), (4), (5); INSERT INTO user_profiles (id, user_id) value (1, 1), (2, 2), (3, 3);
ユースケース
- 不具合調査
- 開発
ソースコード
なし
終わりに
正直当たり前レベルの記事ではあります。開発環境だとレコード数が少ないので無理やり何とかしてましたが、本番環境だとレコード数が多かったのでこの方法が必要でした。
ある程度大きい会社になると、データの安全性の面からIT監査法人から開発と運用を分けるように指示されてしまうのでなかなか使う機会がなかったです。こういう細かい技を今のうちにどんどん覚えていきたいですね。