我有一种情况,需要与INNET JOIN
一起分页。这里有一个类似的场景:分页和INNER 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);
真实的情况我已经是与此类似,但该查询是如此的复杂,我需要得到它与内部工作加入。我希望我说清楚。任何想法我如何得到这样的工作?
编辑
根据我的第一选择查询的上述结果,我应该能够检索产品,其CatID
为1-4我的第二个查询。这就是我的目标。
你应该使用'ROW_NUMBER()OVER(ORDER BY ...)'在第一个'SELECT'和不在派生表中'INNER JOIN(SELECT ...)as cat'。 – 2012-04-17 09:54:55
@BogdanSahlean谢谢,但这并不能解决我的主要问题。我想分类分类而不是产品。基于此,我应该找回适当的产品。我的意思是,我应该能够获得CatID为1和4的产品。 – tugberk 2012-04-17 10:05:17
看到我的答案。您可以使用['DENSE_RANK'功能](http://msdn.microsoft.com/en-us/library/ms173825.aspx)。 – 2012-04-17 10:14:24