0

私はSQLServer2005で作業しており、次のような2つのテーブルがあります。

表1

ID (Guid) Primarykey
something1 (string)
something2 (string)

表2

ID (Guid) Primarykey
Table1ID (Guid) is a ForeignKey to Table1
OrderNr (int)
something1 (string)
something2 (string)

次に、選択クエリ(数百の結果が得られます)を実行する必要があります。基本的には次のようになります。SELECT * from Table2 where something1 = 'foo' order by Table1ID, OrderNr

特に順序は重要ですが、変更することはできません。そして、ステートメントは実際にははるかに複雑で、多くの結合、副選択、場所などがありますが、ここでは必要ありません...

私の問題は、特別なページングが必要なことです。ID10からID 15までの20の異なるTable1IDを持つすべての行を選択するだけです(つまり、ページングが必要ですが、行数ではなく、この列の一意の値が必要です

ネストされたselectまたはselectステートメントの反復数を追加する関数呼び出しがある場合、betweenを使用できますが、一意のIDをカウントして、そこのクエリに追加するにはどうすればよいですか?

助けてくれてありがとう、カール

4

2 に答える 2

2

ROW_NUMBERで使用できますPartition By

WITH CTE AS
(
   SELCT Columns, ...
       , RN = ROW_NUMBER() OVER (PARTITION BY Table1IDs ORDER BY ID)
   FROM dbo.Table
)
SELECT Columns, ...
FROM CTE
WHERE RN BETWEEN 10 AND 15

(または私はあなたの要件を誤解しましたが、それは非常にありそうもないことではありません)

于 2012-10-18T11:11:42.577 に答える
1

実際、それはティム・シュメルターが言ったことと似ていますが、ROW_NUMBER() OVER (PARTITION BY...ではなくDENSE_RANK() OVER (ORDER BY Table1ID) AS rank

説明:DENSE_RANKは私が望むことを正確に実行します。私の場合、Table1IDによってテーブルをランク付けします。その結果、各Table1IDは独自のランク番号を取得します。とrank between 10 and 15私は私が望んでいたものを正確に手に入れます。

戦車、カール

于 2012-10-18T11:47:28.547 に答える