2011-03-16 51 views
1

我一直試圖複製SQL Server中MySql中提供的限制和範圍功能,但迄今還沒有運氣。我發現了幾個指南,現在認爲我的SQL代碼幾乎是正確的,但我仍然在下面發佈錯誤。如何使用top子句在SQL Server中複製mysql範圍和限制

System.Data.SqlClient.SqlException: 只有一個表達式可以指定在選擇列表 當子查詢 沒有用EXISTS引入

錯誤代碼表示使用存在,但我嘗試過,而不是不在,我仍然得到一個錯誤。

我的SQL是下面貼

SELECT TOP (@range) * 
FROM client 
WHERE clientId NOT IN 
     (SELECT TOP (@limit) * 
     FROM client 
     ORDER BY clientId) 
ORDER BY clientId 

回答

3

你需要對你的代碼的變化是

SELECT TOP (@range) * 
FROM client 
WHERE clientId NOT IN (SELECT TOP (@limit) clientId /*<-- NOT "*" here */ 
         FROM client 
         ORDER BY clientId) 
ORDER BY clientId 

這也可以通過如下使用row_number(執行更好地依賴於做可用的不同指數以及整個查詢的覆蓋指數與僅在clientId的窄指數相比有多寬。)

DECLARE @lowerlimit int 
SET @lowerlimit = @range [email protected]; 

WITH cte As 
(
SELECT TOP (@lowerlimit) * , ROW_NUMBER() OVER (ORDER BY clientId) AS RN 
FROM client 
ORDER BY clientId 
) 
SELECT * /*TODO: Your Actual column list*/ 
FROM cte 
WHERE RN >= @limit 
+0

感謝的作品。我當時並不像我想的那樣接近正確的答案。 – 2011-03-16 17:30:14

+0

用於windows的函數。 IT只有一次掃描,因此幾乎總是會表現得更好(除非優化器執行了其中的一個魔術技巧) – luckyluke 2011-03-16 17:41:48

+0

@andrew - 您非常接近,您可能想嘗試兩種替代方法並查看花費以查看哪種方法最適合您數據。 – 2011-03-16 17:42:28

0

另一個(類似,慢:))方式

SELECT * FROM (  
    select rank() over (ORDER BY yourorder) as rank, *.X 
       from TableX X 
) x2 WHERE rank between 5 and 10