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

CASE式のすすめ

SQL実践入門を7割がたぐらい終えたところで同著者の方の「達人に学ぶSQL徹底指南書」を学習しようと思っています。 この方の著書は気づいたら結構読んでましたね。 Contents1 CASE式での注意 …

no image

DBUtils活用

普段はJavaEEで開発を行っているのでデータベースへのアクセスはJPAを活用しています。 ただ、JavaEE環境だとglassfish経由でデータベースを動かしているので、glassfishを動かさ …

no image

JavaでのSQLの書き方

ちょっと小ネタです。 通常SQLを記述する場合、縦に分けて書くのが見た目にも見やすく、保守性も高いです。 例として

と書くよりは、 [ …

no image

EXISTSと集合

前回に引き続きEXISTSの問題です。 下記のようなテーブル(projects)があり、 project_id | step_nbr | status ———&#8 …

no image

JPAでのリレーションに関して

JPAではテーブルをクラスで定義します。もちろん例外とかはいろいろあるのですが、1テーブル1クラスというつくりで、これをエンティティと呼びます。 もともとクラスを作ってからDBを作成したり、JTAの規 …

アーカイブ