0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

テーブルに存在しないデータを探す

Posted at

以下のテーブルがある

select * from meetings;

+-----------+--------+
| meeting   | person |
+-----------+--------+
| 第1回    | 伊藤   |
| 第1回    | 坂東   |
| 第1回    | 水島   |
| 第2回    | 伊藤   |
| 第2回    | 宮田   |
| 第3回    | 坂東   |
| 第3回    | 宮田   |
| 第3回    | 水島   |
+-----------+--------+

meetingに出席しなかったpersonを取得する。

方法として、全員が解禁したと仮定した場合の集合を作り、
そこから現実に出席した人々を引き算する。

全員が解禁した場合の集合はクロス結合で作れる。

select
distinct
m1.meeting
,m2.person
from 
meetings m1 
cross join 
meetings m2

+-----------+--------+
| meeting   | person |
+-----------+--------+
| 第1回    | 伊藤   |
| 第2回    | 伊藤   |
| 第3回    | 伊藤   |
| 第1回    | 坂東   |
| 第2回    | 坂東   |
| 第3回    | 坂東   |
| 第1回    | 水島   |
| 第2回    | 水島   |
| 第3回    | 水島   |
| 第1回    | 宮田   |
| 第2回    | 宮田   |
| 第3回    | 宮田   |
+-----------+--------+

上記から実際の出席者の集合であるmeetingsテーブルに存在しない組み合わせに限定する。

select
distinct
m1.meeting
,m2.person
from 
meetings m1 
cross join 
meetings m2
where
not exists
(
    select
    *
    from
    meetings m3
    where
    m1.meeting = m3.meeting
    and m2.person = m3.person
)
order by
m1.meeting

+-----------+--------+
| meeting   | person |
+-----------+--------+
| 第1回    | 宮田   |
| 第2回    | 坂東   |
| 第2回    | 水島   |
| 第3回    | 伊藤   |
+-----------+--------+

こちらを参考にさせていただきました。
達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?