- - PR -
SQL Server 2005:WHERE句で複数条件のある IN の使い方を教えてください。
1
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-04-01 18:36
こんにちは。よろしくお願いします。
以下のようなデータがあります。 コード | 日付 | 数量 ------------------------- 01001 | 3/15 | 2 01001 | 3/30 | 4 同一商品コードで日付の最も大きい明細がほしい時、Oracleでは次のようなSQL文を実行しておりました。 SELECT コード、日付、数量 FROM (SELECT コード、日付、数量 FROM テーブル WHERE (コード,日付) IN (SELECT コード,MAX(日付) FROM コード GROUP BY 日付)) 単純に SELECT コード,MAX(日付),数量 FROM テーブル GROUP BY コード、数量 としてしまうと、数量が異なるため、3/15 と 3/31 日 両方のデータが出力されるためサブクエリを作って最も大きい日付しか出ないようにしていました。 これをSQLServerで実行すると、エラーになってしまいます。 何か代替の方法はないでしょうか? よろしくお願いします。 | ||||||||||||||||
|
投稿日時: 2008-04-01 19:43
select b.*
from (select a.* , row_number() over (partition by コード order by 日付 desc) rownum from [テーブル] a) b where b.rownum=1 で取得できます。 | ||||||||||||||||
|
投稿日時: 2008-04-01 22:33
SQL Serverは、主要RDBMSの中で唯一といってもいいかも知れませんが、SQL99で規定された「行値構成子(row value constructor)」(「行値式」と呼ぶ場合もある)を実装していません。
SQL例をいくつか示します。SQL例4は、SQL Server 2005以降のみ実行可能です。 1.SQL例1
2.SQL例2
3.SQL例3
4.SQL例4
| ||||||||||||||||
|
投稿日時: 2008-04-01 22:39
SQL例3の例題が不適切だった(サブクエリでALLを使う意味がなかった)ので、訂正します。
3.SQL例3
| ||||||||||||||||
|
投稿日時: 2008-04-02 14:21
別解の一例です。
select t1.* from t as t1 inner join ( select コード,max(日付) as 日付 from t group by コード ) as t2 on t1.コード=t2.コード and t1.日付=t2.日付 | ||||||||||||||||
|
投稿日時: 2008-04-02 14:37
close danceさま
忠犬さま ノラさま ご返信ありがとうございます。 非常に参考になりました。 ありがとうございました。 |
1