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基礎 ウィンドウ関数

SQLの基礎(主にSELECT)を whereはレコードに対しての集計、havingはレコードの集合に対しての集計 ビューは一時的なselect文なのでサブクエリとほぼ等価 条件分岐で出力項目を変えた …

no image

CASE+HAVING句

今回はCASEとHAVINGを組み合わせて、そこそこの難問を解いていきます。 まず下記のようなテーブル(testresults)があるとします。 student | class | sex | sco …

no image

ER図作成ツールについて(Mac版)

ER図作成ツールについてMacで色々と調べましたので、メモを。 フリー限定で。 ちなみにwindowsを使っていればA5:SQLが一番使えるかと思います。 以前も下記リンクで説明させていただきました。 …

no image

Firebaseについて

前回Lambdaに少し触れましたが、2019年6月現在、サーバーレスなアプリというものが活況(?)のようです。 大規模なアプリというと Webサーバー+RDB+サーバーサイドプログラミング言語 が必須 …

no image

checkboxでの値の管理

formにてcheckboxの値を一つのカラムにいれて管理する機会があったのですが、これ入力更新出会っても検索であっても処理がなかなか厄介です。特に検索の時ですね・・・ 要するに値の候補が1,2,3, …