2011-04-11 46 views
19

Tôi dường như không có nhiều may mắn trên trang web này, vẫn mãi mãi là người lạc quan, tôi sẽ tiếp tục cố gắng. Tôi có hai bảng, tạp chí và ArticleCategories được gia nhập bằng cách sử dụng truy vấn này:T-SQL Bỏ qua Thủ tục lưu trữ

SELECT Journals.JournalId, 
     Journals.Year, 
     Journals.Title, 
     ArticleCategories.ItemText 
FROM Journals 
     LEFT OUTER JOIN ArticleCategories 
     ON Journals.ArticleCategoryId = ArticleCategories.ArticleCategoryId 

bất cứ ai có thể cho tôi biết làm thế nào tôi có thể viết lại này làm cho nó thành một Skip, Hãy truy vấn. Nói cách khác, tôi muốn nó bỏ qua các bản ghi đầu tiên và sau đó lấy n tiếp theo. Tôi nghĩ ROW_NUMBER có liên quan đến một nơi nào đó nhưng tôi không thể biết cách sử dụng nó trong trường hợp này.

Tôi nghi ngờ lý do tại sao không có nhiều may mắn là tôi thấy khó giải thích những gì tôi đang cố gắng làm. Nếu câu hỏi của tôi không rõ ràng, xin vui lòng cho tôi biết nơi tôi đang đi sai và tôi sẽ sẵn sàng thử lại. Có lẽ tôi cũng nên đề cập đến rằng tôi đang cố gắng để đặt điều này trong một thủ tục được lưu trữ. Rất cám ơn. Rất cám ơn,

+0

'các bản ghi đầu tiên' - theo yêu cầu của cái gì? –

+0

Điểm tốt! Tôi quên đề cập đến nó cần phải được đặt hàng bởi một cái gì đó. Tôi có thể áp đặt lên bạn một lần nữa và hỏi làm thế nào để bao gồm ORDER BY Journals.Year? Rất cám ơn Martin. –

+0

Xin lỗi về bình luận trước đây của tôi Martin. Nếu tôi cẩn thận hơn, tôi sẽ nhận thấy bạn đã bao gồm một tuyên bố ORDER BY. Cảm ơn bạn một lần nữa. –

Trả lời

55

Đối với năm 2005/2008/2008 R2

;WITH cte AS 
(
    SELECT Journals.JournalId, 
      Journals.Year, 
      Journals.Title, 
      ArticleCategories.ItemText, 
      ROW_NUMBER() OVER 
        (ORDER BY Journals.JournalId,ArticleCategories.ItemText) AS RN 
    FROM Journals LEFT OUTER JOIN 
      ArticleCategories 
      ON Journals.ArticleCategoryId = ArticleCategories.ArticleCategoryId 
) 
    SELECT JournalId, 
      Year, 
      Title, 
      ItemText 
FROM cte 
WHERE RN BETWEEN 11 AND 20 

Đối với năm 2012 này là đơn giản

SELECT Journals.JournalId, 
     Journals.Year, 
     Journals.Title, 
     ArticleCategories.ItemText 
FROM Journals 
     LEFT OUTER JOIN ArticleCategories 
     ON Journals.ArticleCategoryId = ArticleCategories.ArticleCategoryId 
ORDER BY Journals.JournalId, 
      ArticleCategories.ItemText 
OFFSET 10 ROWS 
FETCH NEXT 10 ROWS ONLY 
+1

Xuất sắc! Cảm ơn Martin, điều đó đã hoàn hảo. Rất biết ơn. –

2

Ngoài câu trả lời đúng @ Martin Smith - khi sử dụng một GROUP BY, bạn có thể 't sử dụng OFFSET-FETCH mà không cần ORDER BY:

GROUP BY [cols] 

ORDER BY [col] ASC|DESC 

OFFSET 10 ROWS 
FETCH NEXT 10 ROWS ONLY 

Phần sau cung cấp "cú pháp không chính xác gần 'OFFSET'":

GROUP BY [cols] 

--ORDER BY [col] ASC|DESC 

OFFSET 10 ROWS 
FETCH NEXT 10 ROWS ONLY 
Các vấn đề liên quan