- PR -

SQLについて質問です

1
投稿者投稿内容
あかり
常連さん
会議室デビュー日: 2009/02/18
投稿数: 38
投稿日時: 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
となるようにしたいのですが、まったくイメージできずに困ってしまいました。
意見をいただけると幸いです、よろしくお願いいたします。
Toshi
ベテラン
会議室デビュー日: 2007/09/18
投稿数: 68
お住まい・勤務地: 関東のどっか
投稿日時: 2009-04-02 15:39
SQL Server2005なら、ROW_NUMBER関数を利用することで実現できるかもしれません。

引用:

SELECT * FROM TABLE WHERE key BETWEEN 10 AND 100;



たとえば、こんな感じでしょうか。
コード:
SELECT
    ROW_NUMBER() OVER(ORDER BY key) AS No,
    *
FROM
    TABLE
WHERE
    key BETWEEN 10 AND 100
ORDER BY
    key



以上、参考になれば
デューン
大ベテラン
会議室デビュー日: 2004/04/21
投稿数: 174
お住まい・勤務地: Tokyo
投稿日時: 2009-04-02 15:46
keyが重複なければ
DENSE_RANK分析関数を使う手もありますね。
ごん太
大ベテラン
会議室デビュー日: 2002/07/30
投稿数: 182
お住まい・勤務地: 森の中
投稿日時: 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/02/18
投稿数: 38
投稿日時: 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エンジンを記載しなかったために申し訳ありませんでした。
Toshi
ベテラン
会議室デビュー日: 2007/09/18
投稿数: 68
お住まい・勤務地: 関東のどっか
投稿日時: 2009-04-02 16:11
引用:

早速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;



できません。
上記のクエリは、以下の結果をまず取得します。
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)をとる目的がわからないのでなんともいえないのですが、
一応次のクエリで目的は満たせるのかなと・・
※目的の結果を履き違えてるかもしれませんが・・
コード:

SELECT
ROW_NUMBER() OVER(ORDER BY key) AS No,
*
FROM
(
SELECT TOP(1)
*
FROM
TABLE
WHERE
key BETWEEN 10 AND 100
ORDER BY
key
) AS TABLE1
ORDER BY
No DESC



以上

[ メッセージ編集済み 編集者: Toshi 編集日時 2009-04-02 16:12 ]
あかり
常連さん
会議室デビュー日: 2009/02/18
投稿数: 38
投稿日時: 2009-04-02 16:33
Toshi様回答ありがとうございます。

今回の目的はListViewに画面に出し切れる数のレコードを表示したかったため、このようなSQLを必要といたしました。
実際は5レコード程度を出力することになります。

無事に取得することができました。
ありがとうございます。

追記ですが、
DENSE_RANK関数でも取得することができました。
ROW_NUMBERを使用したほうが、DENSE_RANKよりも若干早いようでした。
1

スキルアップ/キャリアアップ(JOB@IT)