2012-04-17 114 views
4

我有一種情況,需要與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我的第二個查詢。這就是我的目標。

+0

你應該使用'ROW_NUMBER()OVER(ORDER BY ...)'在第一個'SELECT'和不在派生表中'INNER JOIN(SELECT ...)as cat'。 – 2012-04-17 09:54:55

+0

@BogdanSahlean謝謝,但這並不能解決我的主要問題。我想分類分類而不是產品。基於此,我應該找回適當的產品。我的意思是,我應該能夠獲得CatID爲1和4的產品。 – tugberk 2012-04-17 10:05:17

+1

看到我的答案。您可以使用['DENSE_RANK'功能](http://msdn.microsoft.com/en-us/library/ms173825.aspx)。 – 2012-04-17 10:14:24

回答

6

一種解決方案可以成爲下一個:

SELECT x.* 
FROM 
(
     SELECT ft.*, 
       cat.CategoryName, 
       DENSE_RANK() OVER (ORDER BY ft.CatID) AS Rnk 
     FROM @fooTable ft 
     INNER JOIN @categories cat ON (cat.CatID = ft.CatID) 
) AS x 
WHERE x.Rnk BETWEEN 1 AND 2 

結果:

ID CatID Name  MinAllow Price CategoryName Rnk 
-- ----- -------- -------- ------- ------------ --- 
1 1  Product1 2  112.20 Cat1   1 
3 1  Product3 5  233.32 Cat1   1 
6 1  Product6 4  12.43 Cat1   1 
7 4  Product7 4  12.43 Cat4   2 
+0

不錯,非常感謝! – tugberk 2012-04-17 12:48:57