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 とか記述すると、
昇順、降順に並べ替えて表示させることができます。