- - PR -
SQLについて質問です
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2009-04-02 15:27
いつもお世話になっております。
SELECT文を用いて、表を抽出し、抽出時に連番を振って取り出したいのですが、単一のSQLではできないのでしょうか? TABLE 内容 key,name 1,a 2,b 10,c 14,d 101,e 例 SELECT * FROM TABLE WHERE key BETWEEN 10 AND 100; 結果 key,name 10,c 14,d となるのですが、NOという項目も作り出したいのです。 NO,key,name 1,10,c 2,14,d となるようにしたいのですが、まったくイメージできずに困ってしまいました。 意見をいただけると幸いです、よろしくお願いいたします。 | ||||||||
|
投稿日時: 2009-04-02 15:39
SQL Server2005なら、ROW_NUMBER関数を利用することで実現できるかもしれません。
たとえば、こんな感じでしょうか。
以上、参考になれば | ||||||||
|
投稿日時: 2009-04-02 15:46
keyが重複なければ
DENSE_RANK分析関数を使う手もありますね。 | ||||||||
|
投稿日時: 2009-04-02 15:52
SELECT ROWNUM,KEY,NAME FROM TABLE
ではどうでしょう? ちょっと修正 SELECT ROWNUM AS No,KEY,NAME FROM TABLE WHERE 〜 [ メッセージ編集済み 編集者: ごん太 編集日時 2009-04-02 15:56 ] | ||||||||
|
投稿日時: 2009-04-02 15:58
Toshi様、デューン様、ごんた様回答ありがとうございます。
肝心なところがもれていました、当方はSQL Server2005を使用しております。 >Toshi様 早速ROW_NUMBERを試してみました、無事に取得することができたのですが、TOP()を使用している場合は正しく取得できません。 SELECT TOP(1) ROW_NUMBER() OVER(ORDER BY key) AS No,* FROM TABLE WHERE key BETWEEN 10 AND 100 ORDER BY No DESC; 結果は2,14,d となってしまいます、TOP()を使用すると実現できないのでしょうか? >デューン様 早速MSDNで検索して試してみたいと思います。 >ごんた様 DBエンジンを記載しなかったために申し訳ありませんでした。 | ||||||||
|
投稿日時: 2009-04-02 16:11
できません。 上記のクエリは、以下の結果をまず取得します。 NO,key,name 1,10,c 2,14,d このクエリに対して、Noの降順で並び替えを行ないます。 NO,key,name 2,14,d 1,10,c 最後に、先頭の一行のみ(Top(1))を取得します。 NO,key,name 2,14,d Top(1)をとる目的がわからないのでなんともいえないのですが、 一応次のクエリで目的は満たせるのかなと・・ ※目的の結果を履き違えてるかもしれませんが・・
以上 [ メッセージ編集済み 編集者: Toshi 編集日時 2009-04-02 16:12 ] | ||||||||
|
投稿日時: 2009-04-02 16:33
Toshi様回答ありがとうございます。
今回の目的はListViewに画面に出し切れる数のレコードを表示したかったため、このようなSQLを必要といたしました。 実際は5レコード程度を出力することになります。 無事に取得することができました。 ありがとうございます。 追記ですが、 DENSE_RANK関数でも取得することができました。 ROW_NUMBERを使用したほうが、DENSE_RANKよりも若干早いようでした。 |
1