2009-05-25 1 views

答えて

16

、:

SELECT RowNr 
FROM (
    SELECT 
     ROW_NUMBER() OVER (ORDER BY mycolumn) AS RowNr, 
     mycolumn 
    FROM mytable 
) sub 
WHERE sub.mycolumn = 42 

たとえば、あなたが主キー42 :)

を探していると仮定し、何かので、サブクエリが必要ですlike:

SELECT 
    ROW_NUMBER() OVER (ORDER BY mycolumn) AS RowNr 
FROM mytable 
WHERE sub.mycolumn = 42 

常に1を返します。 ROW_NUMBER()はWHEREの後ろで動作します。

+0

なぜdownvoteですか?これは、ROW_NUMBERをサポートしているデータベースエンジンでは正しく、役立ちます(これは、通常どおり、選択肢に対するスピードは、特定のDBで特定の測定が必要です)。 –

+0

これはSQL Serverにとって完全に有効なソリューションです。 –

+1

私はdownvoteを与えませんでしたが、OPは彼がMicrosoft SQL Serverを使用していたとは言いませんでした。彼はそうかもしれないが、彼はそう言わなかったし、彼の質問にタグをつけた。 –

0

レコードのサブセット全体を選択せず​​にそのことを知る方法はありません。あなたのPKが整数型であれば、

select count(*) from mytable 
    where id <= 10 -- Record with ID 10 
    order by mycolumn asc 
+1

idによって順序付けされたときに位置を返すので、 'order by'句は効果がありません。 – Guffa

2

SQLはそうではありません。これはセットベースです。つまり、「結果テーブルの位置」はデータベースにとって無意味です。

オブジェクトのコレクションにResultSetをマップするとき、またはオブジェクトを反復するときに、位置を追跡することができます。残念ながら、あなたが「の位置を取得することはできません

select count(*) 
from mytable 
where mycolumn < (select mycolumn from mytable where key = 42) 
+0

+1すばらしい答えです。 SQL ServerはdBaseのようなものではありません。これ以上の "レコード+ 1"などはありません。 –

+0

ポジションが無意味な場合、ORDER BYは何のために使われますか?またはLIMIT、TOP、およびROW_NUMBER? – Andomar

+0

LIMIT、TOP、およびROW_NUMBER()は標準SQL言語の一部ではありません。 –

15

あなたは、あなたがソートされている値は、あなたがのキーの値を知っているのレコードよりも低い値を持つレコード数をカウントすることができますテーブル内の行 "を選択します。

ORDER BYとROW_NUMBER構造のバリアント(使用しているデータベースエンジンによって異なる)を使用すると、実行されるクエリの結果セット内の行の位置が得られます。

ORDER BYがクラスタ化インデックス列のセットにない場合を除き、この位置はテーブル内の任意の位置にマップされませんが、その位置が次の秒に無効になる可能性があります。

私が知りたいのは、あなたがこの「位置」を使用することを意図したものです。

+2

+1シンプルで、ROW_NUMBER()に依存しません。結果に1を加えたり、チャンス<を<= <=に追加する必要があります。 – Andomar

+1

はい、ポジションを0ベースではなく1ベースにしたい場合は可能です。 – Guffa

+0

1つの条件:この方法はユニークキー(PKの場合)にのみ作用します –

0

関連する問題