skillup

技術ブログ

Database

EXISTSと集合

投稿日:

前回に引き続きEXISTSの問題です。

下記のようなテーブル(projects)があり、

project_id | step_nbr | status
————+———-+——–
AA100 | 0 | 完了
AA100 | 1 | 待機
AA100 | 2 | 待機
B200 | 0 | 待機
B200 | 1 | 待機
CS300 | 0 | 完了
CS300 | 1 | 完了
CS300 | 2 | 待機
CS300 | 3 | 待機
DY400 | 0 | 完了
DY400 | 1 | 完了
DY400 | 2 | 完了

1番まで完了しているproject_idを求めるとします。回答として下記のデータが得られればOKです。

project_id
————
CS300
DY400

※本ではstp_nbr=2が完了しているもの(上記の例でいうとDY400)を除いていましたが、私の場合含めました。

この場合、EXISTSの考え方を使うと下記のようになるでしょう。

この場合も、step_nbrが0と1をともに満たしていないといけないのでEXISTSではなく逆のNOT EXISTSを使います。

なおHAVINGの考えを使って下記のように解くこともできます。こっちのほうがイメージはしやすいかも・・・・

イメージとしては上記のSQLから下記のようなテーブルをイメージしGRUOP BYしてadd_pointの累積を考えます。

project_id | step_nbr | status | add_point
————+———-+——–+———–
AA100 | 0 | 完了 | 1
AA100 | 1 | 待機 | 0
AA100 | 2 | 待機 | 0
B200 | 0 | 待機 | 0
B200 | 1 | 待機 | 0
CS300 | 0 | 完了 | 1
CS300 | 1 | 完了 | 1
CS300 | 2 | 待機 | 0
CS300 | 3 | 待機 | 0
DY400 | 0 | 完了 | 1
DY400 | 1 | 完了 | 1
DY400 | 2 | 完了 | 0

-Database
-

執筆者:


comment

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

関連記事

no image

MySQLのSETとFIND_IN_SETについて

MySQLの方ですが、単純な文字列や、数字、日付の他に配列に近いSET型、また5.7以降ではJSONなどを入れることができます。 Contents1 SET型2 FIND_IN_SET SET型 いわ …

no image

MySQLのセキュアな設定

以前SSHの設定についていろいろ書いたんで今回はMySQLに関して。 Contents1 基本的な処方箋(MySQLに限らないかも)2 ホストのアクセスを制限する3 LOCAL INFILEコマンドを …

no image

SQLの高速化について&explain

本日はSQLの高速化について。 高速化といってもさまざまなテクがあると思うのですが、代表的な考え方に関して。 Contents1 高速化に関して1.1 index1.2 ディスクアクセスを減らす1.3 …

no image

slow-query-logについて

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

no image

ユニークキーの設定

MySQLでのユニークキーの設定に関して。 ユニークキーの設定は下記の通り。

ユニークキーを作成した後に確認するのは下記コマンドで。 …