私が何かをするなら
SELECT * FROM mytable ORDER BY mycolumn ASC;
特定の順序で結果テーブルを取得します。
PK が与えられた場合、その結果テーブルのどの位置に私の PK のレコードが含まれるかを SQL で効率的に見つける方法はありますか?
私が何かをするなら
SELECT * FROM mytable ORDER BY mycolumn ASC;
特定の順序で結果テーブルを取得します。
PK が与えられた場合、その結果テーブルのどの位置に私の PK のレコードが含まれるかを SQL で効率的に見つける方法はありますか?
ソートしている値の値が、キー値がわかっているレコードよりも低いレコードの数を数えることができます。
select count(*)
from mytable
where mycolumn < (select mycolumn from mytable where key = 42)
それをサポートするデータベースでは、この目的で ROW_NUMBER() を使用できます。
SELECT RowNr
FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY mycolumn) AS RowNr,
mycolumn
FROM mytable
) sub
WHERE sub.mycolumn = 42
この例では、主キー 42 を探していると想定しています:)
次のような理由で、サブクエリが必要です。
SELECT
ROW_NUMBER() OVER (ORDER BY mycolumn) AS RowNr
FROM mytable
WHERE sub.mycolumn = 42
常に 1 を返します。ROW_NUMBER() は、いわば WHERE の後に機能します。
SQL はそのようには機能しません。これはセットベースです。つまり、「その結果テーブル内の位置」はデータベースにとって意味がありません。
ResultSet をオブジェクトのコレクションにマップするとき、またはそれを反復処理するときに、位置を追跡できます。
レコードのサブセット全体を選択しない限り、それを判断する方法はありません。PK が整数型の場合、次のことができます。
select count(*) from mytable
where id <= 10 -- Record with ID 10
order by mycolumn asc