skillup

技術ブログ

Database

NOT EXISTSの利用

投稿日:

引き続きNOT EXISTSの利用です。

思った以上に使えますね・・・がムズイ。

今回は下記のようなテーブル(seats)があるとします。

ケースとしては新幹線の座席番号で空は席が空いている状態、占は誰かが座っている状態です。ここで3人が並んで座れるシートを求めるとします。

seat | status
——+——–
1 | 占
2 | 占
3 | 空
4 | 空
5 | 空
6 | 占
7 | 空
8 | 空
9 | 空
10 | 空
11 | 空
12 | 占
13 | 占
14 | 空
15 | 空

最初は以前の例のように歯抜けを求めようかと思いましたが、そもそも歯抜け自体が2つ以上重なっていることもあり没に・・・

そこで始点と終点をもとめ、間に占が存在しているレコードがない、という状態を作ります。サブクエリの期間範囲指定の問題で扱った考え方です。

イメージとしてはまずいつものように自己結合でテーブルを求めます。

ここで下記のようなテーブルが出力されます
start_seat | connect_string | end_seat
————+—————-+———-
1 | ~ | 1
‥‥‥‥‥(略)‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
15 | ~ | 15

ここでs1とs2の間に占が存在しないという条件を作ります。

start_seat | connect_string | end_seat
————+—————-+———-
3 | ~ | 4
3 | ~ | 5
4 | ~ | 5
7 | ~ | 8
7 | ~ | 9
7 | ~ | 10
7 | ~ | 11
8 | ~ | 9
8 | ~ | 10
8 | ~ | 11
9 | ~ | 10
9 | ~ | 11
10 | ~ | 11
14 | ~ | 15

上記だと条件に合致したレコードをすべて出力するので
例えば3人だったらs1+2 =s2としておきましょう。

下記が回答になります。

start_seat | connect_string | end_seat
————+—————-+———-
3 | ~ | 5
7 | ~ | 9
8 | ~ | 10
9 | ~ | 11

-Database
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

SQL基礎 case&groupbyの活用について

主に集計タイプの計算で大活躍するgroupbyについて。 主な用途は集計とカット。特にcase式と連動した集計はかなり使える 例 nameとageで構成されたテーブルがあるとして、年代ごとの人数を出し …

no image

アンチパターン バインド変数の未使用+直積組み合わせ+データ量爆発+インデックス関連

本日はSQLコーディングに関して。 ここら辺は実際にプログラムを書く際に重要になってくるネタ。 Contents1 バインド変数1.1 デメリット1.2 対策2 直積により組み合わせが爆発する2.1 …

no image

slow-query-logについて

データベースを伴う部分でののチューニングですが、大きく分けると SQLを書き直す インデックスを張りなおす プログラム内部でキャッシュを有効化する 設定ファイルの修正 上記のようなかんじになるのではな …

no image

SQL 更新系に関して

SQL実践入門、残り2章になりましたが、いやーむずいっす。 今回は9章を進めていますがSQLはもともと検索を主な用途として発展したため、SELECT文の使用がメインになります。 ですが、UPDATE文 …

no image

DBの構造について メモリとHDD

データベースについてまたまた学習中。 覚えておきたいポイントなど。 データを収めておくべき媒体では「記憶コスト(単位金額当たりの容量)」と「アクセス速度」の2つが重要なパラメータ メモリとHDDでは前 …