2009-07-03 11 views
6

私は、SQLクエリを持っている:sql result-setの行の位置を特定する方法は?

select id, name from table order by name 

結果は次のようになります。指定されたidの

52 arnold 
33 berta 
34 chris 
47 doris 
52 emil 

= 47がどのように私は、結果セット内の位置を決定することができますか? 結果ため4でなければならない:

52 arnold 
33 berta 
34 chris 

は(47、ドリス)の前であり、ID = 41は、結果セット内の4位にあります。

これをSQLで行う方法は? HQLではどうですか? ページネーションの例では、2つのステートメントを実行する必要がありますか、それともid = 47の行を含むウィンドウを正確に取得できるソリューションがありますか? SQL 2005を想定し

PostgreSQLとjavaの

答えて

10

以前の投稿は正しいです。 Microsoft SQL Server 2005以上を使用する場合は、ROW_NUMBERを使用してください。

ただし、タグではMSSQLを使用しているとは指定されていないため、ほとんどのRDBMS実装で機能するはずのソリューションです。基本的に、相関サブクエリを使用して、外部クエリのORDER句の値に基づいて、現在のローよりも小さい同じセット内のローの数を判断します。このようなもの:

SELECT  T1.id, 
      T1.[name], 
      (SELECT COUNT(*) 
      FROM table T2 
      WHERE T2.[name] < T1.[name]) + 1 AS rowpos 
FROM  table T1 
ORDER BY T1.[name] 
+0

どのようにネクタイを扱いますか? – brad

+0

私はそれがあなたがネクタイを壊すために使いたいものに依存していると思います。追加のcrieriaをサブクエリに追加して、 'rowpos'計算をさらに区別して結び目が生成されないようにするか、外部クエリに追加の句を追加して結合を解除することができます。 –

+1

あなたのDBがROW_NUMBERを提供していても、このケースはROW_NUMBERより速いのですか?私はこの方法がO(n)対O(n * log(n))(行番号の取得)であると仮定します – Flati

2

、あなたはあなたが実行しているRDBMSどの言及しませんが、SQL Server 2005またはそれ以上を使用している場合、あなたが利用することができますRow_Number

3

を使用することができますROW_NUMBER()関数は、 - このように:そして

SELECT id, name, ROW_NUMBER() OVER (ORDER BY name) AS RowNumber 
FROM MyTable 

、所与の行をフェッチするには、派生テーブルまたは共通表式を使用することができる - このような:

;WITH NumberedRows 
AS 
(SELECT id, name, ROW_NUMBER() OVER (ORDER BY name) AS RowNumber 
FROM MyTable) 
SELECT RowNumber FROM NumberedRows WHERE id = 47 

レコードが「どのページ」であるかを分類するには、行番号を1ページあたりのレコード数で割り、最も近い整数に切り上げる必要があります。

1

答えは、使用しているSQLのバージョンによって異なります。

MSSQL 2005を使用している場合、新しい分析関数ROW_NUMBER()を使用して、order by節で定義した順序で連続番号を生成できます。 ROW_NUMBER()関数の構文は次のとおりです。

ROW_NUMBER()(ORDER BY)OVER

または

OVER ROW_NUMBER()

(PARTITION BY)あなたは、以前のバージョンを使用している場合SQL Serverでは、ID列を使用して一時テーブルを作成し、その結果を選択することができます。

1

使用Row_Number

関連する問題