と一緒にページネーションを行う必要がある状況がありINNET JOIN
ます。これは私が持っている同様のシナリオです:
DECLARE @categories AS TABLE(
CatID INT,
CategoryName NVARCHAR(100)
);
DECLARE @fooTable AS TABLE(
ID INT,
CatID INT,
Name NVARCHAR(100),
MinAllow INT,
Price DECIMAL(18,2)
);
INSERT INTO @categories VALUES(1, 'Cat1');
INSERT INTO @categories VALUES(2, 'Cat2');
INSERT INTO @categories VALUES(3, 'Cat3');
INSERT INTO @categories VALUES(4, 'Cat4');
INSERT INTO @categories VALUES(5, 'Cat5');
INSERT INTO @fooTable VALUES(1, 1, 'Product1', 2, 112.2);
INSERT INTO @fooTable VALUES(3, 1, 'Product3', 5, 233.32);
INSERT INTO @fooTable VALUES(6, 1, 'Product6', 4, 12.43);
INSERT INTO @fooTable VALUES(7, 4, 'Product7', 4, 12.43);
INSERT INTO @fooTable VALUES(8, 5, 'Product8', 4, 12.43);
これらは私が持っている記録です。ご覧のとおり、一部のカテゴリには 内に商品がありません@fooTable
。次のステップとして、次のSELECT
ステートメントがあります。
SELECT * FROM @fooTable ft
INNER JOIN (
SELECT ROW_NUMBER() OVER (ORDER BY CatID) AS RowNum, * FROM @categories
) AS cat ON (cat.CatID = ft.CatID);
出力にカテゴリの行番号も含まれることを除いて、これは基本的な JOIN です。このクエリで得た結果は次のとおりです。
ID CatID Name MinAllow Price RowNum CatID CategoryName
---- ------- ------------- ----------- --------- -------- -------- -------------
1 1 Product1 2 112.20 1 1 Cat1
3 1 Product3 5 233.32 1 1 Cat1
6 1 Product6 4 12.43 1 1 Cat1
7 4 Product7 4 12.43 4 4 Cat4
8 5 Product8 4 12.43 5 5 Cat5
列を見るRowNum
と、これらの値がページネーションに適していないことがわかります。したがって、このテーブルを次のようにページ分割しようとすると、間違った出力が得られました。
SELECT * FROM @fooTable ft
INNER JOIN (
SELECT ROW_NUMBER() OVER (ORDER BY CatID) AS RowNum, * FROM @categories
)AS cat ON (cat.CatID = ft.CatID) AND (cat.RowNum BETWEEN 1 AND 2);
私が持っている実際の状況はこれに似ていますが、そのクエリは非常に複雑で、INNER JOIN で動作させる必要があります。私はそれを明確にしたことを願っています。どうやってそのようなものを機能させたのですか?
編集
CatID
上記の最初の選択クエリの結果によると、2 番目のクエリで 1 と 4の製品を取得できるはずです。それが私の目標です。