BBH
-Biz Branding Hub-
投稿日 : 
2019/12/07
更新日 : 
2019/12/07

【SQL】存在しない組み合わせを表示するサンプル

業務において、存在しない組み合わせを表示する必要に迫られることはよくあります。
例えば、以下のような表が存在するとしましょう。
この表は、開催されたミーティングの回数とその回の出席者の一覧です。
例えば、1行目は「伊藤さんが第1回目のミーティングに出席した」ことを表しています。

この表から、回ごとの欠席者を出したいという時、どのようにSQLで表現すればよいでしょうか。
例えば、水島さんは第2回のミーティングに参加していません。
こうした回ごとの欠席者の一覧を表示したいのです。

この時、以下のように考えることで、回ごとの欠席者を求めることができます。
・全ての組み合わせから、実際に存在する組み合わせを排除する
図にすると以下のようなイメージです。

これをSQLで表現する場合は、以下のように記述します。

存在しない組み合わせを表示するSQL

-- ①CROSS JOIN + Distictで全ての「meeting」と「person」の組み合わせを求める
select distinct
  p1.meeting, p2.person
from
  p5_shusseki p1
cross join
  p5_shusseki p2
-- ②そのうち、実際に存在する組み合わせを除外する
where 
  not exists (
    select 1
    from p5_shusseki p3
    where p3.meeting = p1.meeting
    and p3.person = p2.person);

Profile

管理人プロフィール

都内でITエンジニアをやってます。
変遷:中規模SES→独立系SIer→Webサービス内製開発
使用技術はその時々でバラバラですが、C#、AWSが長いです。
どちらかと言うとバックエンドより開発が多かったです。
顧客との折衝や要件定義、マネジメント(10名弱程度)の経験あり。
最近はJava+SpringBootがメイン。

Recommend