skillup

技術ブログ

Database

HAVING句の活用 発展編

投稿日:

今回からはまたまたHAVING句です。

下記のようなテーブル(teams)があり、全員が待機状態のチーム(全員がそろっている)を求めます。

member | team_id | status
——————+———+————-
ジョー | 1 | 待機
ケン | 1 | 出動中
ミック | 1 | 待機
カレン | 2 | 出動中
キース | 2 | 休暇
ジャン | 3 | 待機
ハート | 3 | 待機
ディック | 3 | 待機
ベス | 4 | 待機
アレン | 5 | 出動中
ロバート | 5 | 休暇
ケーガン | 5 | 待機

回答は下記のようになります。

team_id
———
4
3

これをNOT EXISTSとHAVINGを使って2パターンで記述する問題なのです。

HAVING

NOT EXISTS

本にも書いてありましたが、私もHAVINGのほうがわかりやすいですね。

CASEとHAINGは見た目がごつい割には理解しやすくフラグ的な扱いができるのでプログラマには向いている気がします。

ちなみにHAVINGを使って下記のように書く回答もありました。

一瞬わからなかったのですが、これはもしteam_id単位で複数のstatusが存在していたら最大と最小が違うという意味なんですね。分かりにくい場合はstatusを数字で考えるとよいと思います。

次は下記のテーブルで拠点ごとに資材のダブりをみるSQLです。

center | receive_date | material
—————–+————–+——————–
東京 | 2007-04-01 | 錫
東京 | 2007-04-12 | 亜鉛
東京 | 2007-05-17 | アルミニウム
東京 | 2007-05-20 | 亜鉛
大阪 | 2007-04-20 | 銅
大阪 | 2007-04-22 | ニッケル
大阪 | 2007-04-29 | 鉛
名古屋 | 2007-03-15 | チタン
名古屋 | 2007-04-01 | 炭素鋼
名古屋 | 2007-04-24 | 炭素鋼
名古屋 | 2007-05-02 | マグネシウム
名古屋 | 2007-05-10 | チタン
福岡 | 2007-05-10 | 亜鉛
福岡 | 2007-05-28 | 錫

下記のレコードが出力されればOKです。

center
—————–
東京
名古屋

これまた回答を見るとなんの変哲もないですが、意外にロジックが考えにくい題材だと思います。

要はダブりがなければ全体の列数とdistinctなmaterialの列数が一緒になるんですね。なのでそうなっていないケースを求めます。

ちなみに下記の書いてあげると全てのcenterのstatusがわかり大変みやすいです。

center | status
—————–+————
大阪 | ダブりなし
東京 | ダブりあり
福岡 | ダブりなし
名古屋 | ダブりあり

ちなみにEXISTSでもいけます。こちらだとダブっている素材もわかりますね。

-Database
-

執筆者:


comment

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

関連記事

no image

外部結合 応用編2

引き続き結合についてです。 Contents1 1対Nの結合に関して2 完全外部結合3 差集合(class_aだけに存在するものとclass_bだけに存在するもの)3.1 class_aのみ3.2 c …

no image

transactionが切れた場合のロックの復旧方法

transactionをスタートしたまま、commitせずにプログラムを途中で止めた場合の処理について。 不用意にプログラムを止めないようにしましょう。 Contents1 ロックのメカニズム1.1 …

no image

サロゲートキーに関して

テーブル設計に関してのメモ。 テーブルを作る時にid int not null auto_increment primary keyを自動的に作ることが多いと思いますが、サロゲートキーといい、グレーノ …

no image

ajaxのasync:falseと複数DBのjoinに関して

本日も小ネタ集です。 Contents1 ajax:false2 複数DBでのJOIN ajax:false ajaxは非同期処理が基本ですが、async:falseとすると同期処理になります。 ただ …

no image

サブクエリ 移動平均など

前回の応用編です。 日付、入出金、残高はできましたが、ここからさらに、現在のレコードから3行以内(3行あれば3行、なければそれ以内でできるだけ)のレコードの合計値を出す計算を考えます。 結果だけ先に書 …

アーカイブ