0

私は週末ずっとこれと戦っていて、アイデアがありません。Web サイトの検索結果にページを表示するには、SQL Server 2005 Express データベースから行のサブセットを返す必要があります (つまり、行 20 から開始して、次の 20 レコードを取得します)。MySQL では、「LIMIT」キーワードを使用して、開始する行と返す行数を選択します。

SQL Server で ROW_NUMBER()/OVER を見つけましたが、使用しようとすると「Over not supported」と表示されます。これは、SQL Server 2005 Express (無料版) を使用しているためだと考えています。これが本当かどうか、または OVER 句がサポートされない他の理由があるかどうか、誰でも確認できますか?

次に、次のような古い学校のバージョンを見つけました。

SELECT TOP X * FROM TABLE WHERE ID NOT IN (SELECT TOP Y ID FROM TABLE ORDER BY ID) ORDER BY IDここで、X = ページあたりの数、Y = 開始するレコード。

ただし、私のクエリは、多くの外部結合があり、メイン テーブルにあるもの以外の順序でより複雑になっています。たとえば、ユーザーが投稿した動画の数で並べ替える場合、クエリは次のようになります。

SELECT TOP 50 iUserID, iVideoCount FROM MyTable LEFT OUTER JOIN (SELECT count(iVideoID) AS iVideoCount, iUserID FROM VideoTable GROUP BY iUserID) as TempVidTable ON MyTable.iUserID = TempVidTable.iUserID WHERE iUserID NOT IN (SELECT TOP 100 iUserID, iVideoCount FROM MyTable LEFT OUTER JOIN (SELECT count(iVideoID) AS iVideoCount, iUserID FROM VideoTable GROUP BY iUserID) as TempVidTable ON MyTable.iUserID = TempVidTable.iUserID ORDER BY iVideoCount) ORDER BY iVideoCount

問題はサブクエリのSELECT 行にあります: TOP 100 iUserID, iVideoCount

「NOT IN」句を使用するには、サブクエリに1列しか持てないようです(「SELECT TOP 100 iUserID FROM ...」)。しかし、そのサブクエリの SELECT ステートメントに iVideoCount を含めないと、サブクエリの ORDER BY iVideoCount が正しく順序付けされないため、サブクエリが親クエリとは異なる順序で並べられ、このすべてが役に立たなくなります。順序付けに関与できる外部結合でリンクされた約 5 つのテーブルがあります。

私は途方に暮れています!上記の 2 つの方法は、SQL Server が行のサブセットを返すようにする唯一の 2 つの方法です。結果全体を返し、PHP の各レコードをループする準備が整いましたが、必要なものだけを表示します。それは非常に非効率的な方法であり、本当に私の最後の手段です.

上記のシナリオで SQL Server に MySQL の LIMIT 句を模倣させる方法についてのアイデアはありますか?

4

1 に答える 1

0

残念ながら、SQL Server 2005 の Row_Number()はページングに使用できますが、SQL Server 2012 ではデータ ページングのサポートが Order By Offset と Fetch Next で拡張されています。

  1. ID列を持つ一時テーブルを作成します。
  2. 次に、ORDER BY句を使用して一時テーブルにデータを挿入します
  3. ROW_NUMBER() 値と同様に、一時テーブルの ID 列の値を使用します。

お役に立てば幸いです。

于 2015-09-07T09:20:47.060 に答える