2011-05-17 61 views
1

我有一個SQLServer問題。計算工會結果的第二頁

我想解決如何顯示第二頁的結果。結果的第一頁是使用下面的查詢拉取的。

SELECT TOP 10 * FROM (
    SELECT c.id, c.name, c.inserteddate, c.cityname, ftblstates.name AS statename, clc.name AS catname, '' AS listingimagelogo, '' AS orgname, relocateyn, '' AS employerclassified 
    FROM tblclassifieds c 
    LEFT JOIN tblclassifiedscategories clc ON c.categoryid = clc.id 
    LEFT JOIN ftblstates ON c.stateid = ftblstates.id 
    WHERE c.expirydate != '' AND c.expirydate >= '5/17/2011' 
    UNION ALL 
    SELECT ce.id, ce.name, ce.inserteddate, suburb AS cityname, ftblstates.name AS statename, ce.jobtype AS catname, ce.listingimagelogo, ce.orgname, '' AS relocateyn, '1' AS employerclassified 
    FROM tblclassifiedemployers ce 
    LEFT JOIN ftblstates ON ce.stateid = ftblstates.id 
    WHERE ce.expirydate != '' AND ce.expirydate >= '5/17/2011' 
) a 
ORDER BY inserteddate desc; 

答案與以下內容類似嗎?

SELECT TOP 10 * FROM (
    SELECT c.id, c.name, c.inserteddate, c.cityname, ftblstates.name AS statename, clc.name AS catname, '' AS listingimagelogo, '' AS orgname, relocateyn, '' AS employerclassified 
    FROM tblclassifieds c 
    LEFT JOIN tblclassifiedscategories clc ON c.categoryid = clc.id 
    LEFT JOIN ftblstates ON c.stateid = ftblstates.id 
    WHERE c.expirydate != '' AND c.expirydate >= '5/17/2011' 
    UNION ALL 
    SELECT ce.id, ce.name, ce.inserteddate, suburb AS cityname, ftblstates.name AS statename, ce.jobtype AS catname, ce.listingimagelogo, ce.orgname, '' AS relocateyn, '1' AS employerclassified 
    FROM tblclassifiedemployers ce 
    LEFT JOIN ftblstates ON ce.stateid = ftblstates.id 
    WHERE ce.expirydate != '' AND ce.expirydate >= '5/17/2011' 
) a 

WHERE NOT a.id IN (SELECT TOP 10 tblclassifieds.id ... 

ORDER BY inserteddate desc; 

有人可以幫我完成查詢嗎?

+0

看起來也許你正在試圖找出分頁SQL查詢的一般模式。如果是這樣,你的問題可能是「http://stackoverflow.com/questions/1418105/paging-design-recommendation-for-asp-net-and-sqlserver-2005/1418258#1418258 – 2011-05-17 05:31:13

+0

http:// stackoverflow .com/questions/2135418/equivalent-of-limit-and-offset-for-sql-server – 2011-05-17 05:37:30

+1

@mu引用的問題與上面提到的問題相比,更具體到您的問題,但請注意,這兩個問題的答案都需要使用在SQL Server> = 2005中可以使用'row_number()'函數。對於舊版本,您唯一的工具是選擇'TOP N'作爲示例。假設您需要第四頁,每頁10行,您需要(1)選擇所有行,按照所需的順序排序(2)將行添加到SELECT頂部4 * 10行,按相反順序排序,(3)添加更多行以查詢以從這40個行中選擇前10行,這次按期望的順序排序 – 2011-05-17 06:07:27

回答

2

這樣做的一個簡單的方法:

declare @page int = 2 
declare @take int = 10 

select * from (
    SELECT *, ROW_NUMBER() OVER(ORDER BY inserteddate desc) as rowno FROM (
     SELECT c.id, c.name, c.inserteddate, c.cityname, ftblstates.name AS statename, clc.name AS catname, '' AS listingimagelogo, '' AS orgname, relocateyn, '' AS employerclassified 
     FROM tblclassifieds c 
     LEFT JOIN tblclassifiedscategories clc ON c.categoryid = clc.id 
     LEFT JOIN ftblstates ON c.stateid = ftblstates.id 
     WHERE c.expirydate != '' AND c.expirydate >= '5/17/2011' 
     UNION ALL 
     SELECT ce.id, ce.name, ce.inserteddate, suburb AS cityname, ftblstates.name AS statename, ce.jobtype AS catname, ce.listingimagelogo, ce.orgname, '' AS relocateyn, '1' AS employerclassified 
     FROM tblclassifiedemployers ce 
     LEFT JOIN ftblstates ON ce.stateid = ftblstates.id 
     WHERE ce.expirydate != '' AND ce.expirydate >= '5/17/2011' 
    ) a 
) b 
where rowno > (@page - 1) * @take 
    AND rowno <= @page * @take 
order by rowno 

我沒有改變你的內部查詢。

編輯:在where子句中添加了小節

+0

非常感謝Johan的幫助!你爲我節省了很多時間:) – Ben 2011-05-24 01:22:15

+0

我只是做了一些改變,讓頁面顯示正確數量的結果。 WHERE rowno> @page * @take - @take AND rowno <= @page * @take ORDER BY rowno – Ben 2011-05-24 01:57:38

+0

好吧,我現在明白了,我應該把parenteses oround @page - 1設置成工作狀態,但是你的解決方案工作得很好。 – Johan 2011-05-24 09:21:44