2013-09-25 30 views
1

我有這個內部連接語句在大多數情況下都有效,但是當我添加自定義分頁時,連接返回一個空集。任何建議將不勝感激。SQL ROW_NUMBER()...在x和y之間的中斷內部連接

這將返回我希望

SELECT [Id] 
,[Title] 
FROM 
(SELECT [Id] 
,[Title] 
,ROW_NUMBER() OVER(ORDER BY id) as RowNum from Art) as e 
INNER JOIN [ArtCat] p ON e.Id = p.ArtId 
WHERE 
p.CatId = @CategoryNum 

這將返回一個空集

SELECT [Id] 
,[Title] 
FROM 
(SELECT [Id] 
,[Title] 
,ROW_NUMBER() OVER(ORDER BY id) as RowNum from Art) as e 
INNER JOIN [ArtCat] p ON e.Id = p.ArtId 
WHERE 
p.CatId = @CategoryNum 
AND RowNum BETWEEN @startIndex AND (@startIndex + @pageSize) 

提前感謝的結果!

+0

看起來很好。儘管如此,我已經遇到了帶有窗口​​函數的奇怪事情。如果沒有人提供更好的答案,請嘗試將第一個SQL的結果放入臨時表中,然後運行RowNum BETWEEN ..從它開始 – Steve

回答

0

格式是一個有點難以閱讀,但語法是好的,你爲什麼不檢查你的rownum的界限:

SELECT MIN(RowNum),MAX(RowNum)   
FROM (SELECT [Id] 
      ,[Title] 
      ,ROW_NUMBER() OVER(ORDER BY id) as RowNum 
     FROM Art 
    ) as e 
INNER JOIN [ArtCat] p ON e.Id = p.ArtId 
WHERE p.CatId = @CategoryNum 

賠率是你應該限制在p.CatId = @CategoryNum

後使用ROWNUM

猜測這個工程:

SELECT [Id] 
     ,[Title] 
FROM (SELECT [Id] 
      ,[Title] 
      ,ROW_NUMBER() OVER(ORDER BY id) as RowNum   
     FROM (SELECT [Id] 
        ,[Title] 
      FROM Art 
      ) as e 
     INNER JOIN [ArtCat] p ON e.Id = p.ArtId 
     WHERE p.CatId = @CategoryNum 
    )sub 
WHERE RowNum BETWEEN @startIndex AND (@startIndex + @pageSize) 
+0

我有一個人在工作中幫助我。你是正確的將內聯接放在「from(select)」表中。我需要在設置行號之前過濾結果。 – user2817020

+0

你在哪裏超級關閉。謝謝! – user2817020

0

山羊CO你在哪裏真的很有幫助!謝謝。我們最終使用的代碼是。

SELECT 
     ROW_NUMBER() OVER(ORDER BY id) as e.RowNum 
     ,e.[Id] 
     ,e.[Title] 

FROM (SELECT 
      [Id] 
     ,[Title] 
     ,ROW_NUMBER() OVER(ORDER BY id) as RowNum   
    FROM 
    (SELECT 
      ROW_NUMBER() OVER(ORDER BY id) as RowNum 
      ,[Id] 
      ,[Title] 

      FROM Art 
       INNER JOIN [ArtCat] p ON e.Id = p.ArtId 

     WHERE p.CatId = @CategoryNum 
    ) as e 
WHERE 
    e.RowNum BETWEEN @startIndex AND (@startIndex + @pageSize) 

預過濾結果(像你一樣),但要在外表上做出另一行來真正組織結果。

另外我的同事抱怨我的格式太..哈