SELECT * FROM mytable ORDER BY mycolumn ASC;
のようなことをすると、結果テーブルが特定の順序で取得されます。
PKを使って、結果テーブルのどの位置に自分のPKでレコードが含まれているかを効率的に調べる方法はありますか?
SELECT * FROM mytable ORDER BY mycolumn ASC;
のようなことをすると、結果テーブルが特定の順序で取得されます。
PKを使って、結果テーブルのどの位置に自分のPKでレコードが含まれているかを効率的に調べる方法はありますか?
、:
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の後ろで動作します。
レコードのサブセット全体を選択せずにそのことを知る方法はありません。あなたのPKが整数型であれば、
select count(*) from mytable
where id <= 10 -- Record with ID 10
order by mycolumn asc
idによって順序付けされたときに位置を返すので、 'order by'句は効果がありません。 – Guffa
SQLはそうではありません。これはセットベースです。つまり、「結果テーブルの位置」はデータベースにとって無意味です。
オブジェクトのコレクションにResultSetをマップするとき、またはオブジェクトを反復するときに、位置を追跡することができます。残念ながら、あなたが「の位置を取得することはできません
select count(*)
from mytable
where mycolumn < (select mycolumn from mytable where key = 42)
+1すばらしい答えです。 SQL ServerはdBaseのようなものではありません。これ以上の "レコード+ 1"などはありません。 –
ポジションが無意味な場合、ORDER BYは何のために使われますか?またはLIMIT、TOP、およびROW_NUMBER? – Andomar
LIMIT、TOP、およびROW_NUMBER()は標準SQL言語の一部ではありません。 –
あなたは、あなたがソートされている値は、あなたがのキーの値を知っているのレコードよりも低い値を持つレコード数をカウントすることができますテーブル内の行 "を選択します。
ORDER BYとROW_NUMBER構造のバリアント(使用しているデータベースエンジンによって異なる)を使用すると、実行されるクエリの結果セット内の行の位置が得られます。
ORDER BYがクラスタ化インデックス列のセットにない場合を除き、この位置はテーブル内の任意の位置にマップされませんが、その位置が次の秒に無効になる可能性があります。
私が知りたいのは、あなたがこの「位置」を使用することを意図したものです。
:
なぜdownvoteですか?これは、ROW_NUMBERをサポートしているデータベースエンジンでは正しく、役立ちます(これは、通常どおり、選択肢に対するスピードは、特定のDBで特定の測定が必要です)。 –
これはSQL Serverにとって完全に有効なソリューションです。 –
私はdownvoteを与えませんでしたが、OPは彼がMicrosoft SQL Serverを使用していたとは言いませんでした。彼はそうかもしれないが、彼はそう言わなかったし、彼の質問にタグをつけた。 –