2011-11-19 81 views
1

我已經得到了以下工作查詢:SQL Server 2008中仿效限制功能

 string sqlString = 
      "SELECT * " + 
      "FROM (SELECT ROW_NUMBER() OVER (ORDER BY Id DESC) AS RowNum, * " + 
      "FROM StreamView " + 
      "WHERE Recipient = @Recipient " + 
      ") AS RowConstrainedResult " + 
      "WHERE RowNum >= @startAt " + 
      "AND RowNum < @howMany " + 
      "ORDER BY RowNum;"; 

然後返回給定startAt和的howmany變量的正確行。 我想這樣做與下面的查詢:

 string sqlString = 
     "SELECT DISTINCT l.* FROM Streams l " + 
     "INNER JOIN Friendships f ON f.Sender = @UserName OR f.Recipient = @UserName " + 
     "WHERE l.Sender <> @UserName AND l.Recipient <> @UserName AND (" + 
     "l.Sender = f.Recipient OR l.Sender = f.Sender OR " + 
     "l.Recipient = f.Sender OR l.Recipient = f.Recipient) " + 
     "ORDER BY DateTime DESC;"; 

上述查詢作品完美,但我想要得到的範圍,而不是所有可用行。我需要第一個查詢的相同功能。

想法?謝謝。

+1

什麼排名的範圍? – Hogan

+0

你是什麼意思?第一個查詢是在c#類中,並被調用像這樣('getstream(0,10,'someone')') - 這將從表中返回0到10行。我試圖對第二個查詢做同樣的事情,因爲它們現在已經是它的結果了,但增加了範圍功能(用於懶惰滾動) – user1027620

+0

您正在按日期訂購 - 所以您想要訂購日期的前10個那麼訂購第二個10日期? – Hogan

回答

2

您應該能夠將原始查詢放入子查詢或CTE中,然後使用ROW_NUMBER()調用選擇該查詢。例如,像(未經測試):

WITH CTE1 AS (
    SELECT DISTINCT 
     l.* -- List out all of the column names... 
    FROM 
    ... -- Rest of your query, but you don't need the ORDER BY 
), 
CTE2 AS (
    SELECT 
     CTE1.*, 
     ROW_NUMBER() OVER (ORDER BY DateTime DESC) AS RowNum 
    FROM 
     CTE1 
) 
SELECT 
    CTE2.* 
FROM 
    CTE2 
WHERE 
    RowNum BETWEEN @start_num and @end_num 

我不知道,雖然會用什麼樣的查詢計劃的SQL Server對於這一點,因此性能可能不是很好。

+1

爲什麼不全都在cte1中?選擇不同的l。*,ROW_NUMBER()OVER(ORDER BY DateTime DESC)AS RowNum ... – danihp

+1

當我編寫查詢時,我有一個理由在我的腦海中,但如果現在可以想到它,我會被詛咒:) –

+1

也許是由於「獨特」的關鍵詞。 ;) – danihp