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

netbeansのJPQL補助機能

JPAでは基本的に生のSQLではなく、JPQLを使って書きます。 SQLでもタイプミスにイライラさせられることは多いのですが、JPQLはもっとですね・・・爆 そこで使えるのがNetbeansの入力補助 …

no image

GlassFishでDB接続

JavaEEではアプリケーションサーバーとしてGlassFishを使いますが、先日、GlassFishを通さないとJavaEEでDBが動かせないということを知りました。そのためJavaEEではデータベ …

no image

第二、第三の正規化&ER図&Check制約

前回第一正規化を話したので、第二、第三に進んでいきます。 Contents1 第二正規化とは?2 第三正規化とは?3 正規化のメリット4 ER図5 本日のSQLネタ Check制約 第二正規化とは? …

no image

MySQL safe mode

MySQLに関してしっかりパスワードをチェックしていれば問題ありませんが、中にはrootパスワードをわすれた!なんてこともあるでしょう。 そんなときはsafe modeで実行することでrootのパスワ …

no image

アンチパターン トランザクションスコープ+大量データのリアルタイム集計+接続が詰まる

本日は主にインフラの設計的なことに関して。 Contents1 トランザクションスコープの設定1.1 デメリット1.2 対策2 大量データのリアルタイム集計2.1 デメリット2.2 対策3 詰まると接 …