SQL server Management Studio の使い方
以下の書籍を参照しました。
SQL Server 2008の教科書
松本美穂 松本崇博 ソシム株式会社 2009
■複数件のサブクエリ
++ 果物 ++
AID 名前 入り数 BID
1 イチゴ 30 10
2 りんご 12 10
3 みかん 15 20
4 さくらんぼ 50 10
5 マンゴー 15 10
ってテーブルがあったとします。
・・・すぅっごくいまさらなんだけど、
「BID」は単純に果物の色分けです。
BID=10 のものは、赤い果物
BID=20 のものは、黄色い果物
って、私が勝手に決めてるだけです。。。
んでね、色分けごとに、入り数が最大値のものを抽出したい場合、
select * from 果物
where 入り数 = (select max(入り数) from 果物 group by BID)
ってしたくなるんだけど、これだとよくわかんないエラーが出ます。
()内の結果が複数個あるから、らしいんだけど。
そこで使うのが、「IN演算子」
select * from 果物
where 入り数 in (select max(入り数) from 果物 group by BID)
ってすると、
AID 名前 入り数 BID
3 みかん 15 20
4 さくらんぼ 50 10
5 マンゴー 15 10
てな結果が返ってきます。
が、イラナイモノがありますですよね・・・
5 マンゴー 15 10
これ、なんで出てきちゃってるの!?
BID=20のみかんの最大入り数「15」と同じなので
取得されているようです。
要するに、
select * from 果物
where 入り数 in ( 50, 15 )
の結果を返してるんですね。。。
そこで、()内の結果を(selectステートメントの結果、っているう言い方するみたい)
テーブルのようにしちゃいましょう。
inner joinのところでちょびっと出てきた、
別名を付ける方法です。
http://ameblo.jp/beginner-shelly/entry-10826661854.html
select * from 果物
inner join(select BID, MAX(入り数)M入り数 from 果物 group by BID) as tableB
on 果物.BID = tableB.BID
ってすると。。。
AID 名前 入り数 BID BID M入り数
1 イチゴ 30 10 10 50
2 りんご 12 10 10 50
4 さくらんぼ 50 10 10 50
5 マンゴー 15 10 10 50
3 みかん 15 20 20 15
うむむ??ほしい結果とは違う…
では、一行追加して、
select * from 果物
inner join(select BID, MAX(入り数)M入り数 from 果物 group by BID) as tableB
on 果物.BID = tableB.BID
and 果物.入り数 = tableB.M入り数
AID 名前 入り数 BID BID M入り数
3 みかん 15 20 20 15
4 さくらんぼ 50 10 10 50
うおー!できた!!
こういうのを、「インライン ビュー」と言うらしいです。
最後の行に、
order by 列名 asc とか
order by 列名 desc とか記述すると、
昇順、降順に並べ替えて表示させることができます。