私は週末ずっとこれと戦っていて、アイデアがありません。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 句を模倣させる方法についてのアイデアはありますか?