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

MariaDBインストール

CentOS7からはyumでmysqlをインストールするとMariaDBがディフォルトになるようです。 せっかくなので、これを機にMariaDBを使ってみました。といってもMySQLとほとんど一緒でし …

no image

GlassFishでDB接続

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

no image

MySQLのSETとFIND_IN_SETについて

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

no image

SQL基礎 ウィンドウ関数

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

no image

SQL 更新系に関して

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