如何使用top子句复制SQL Server中的mysql范围和限制

时间:2011-03-16 17:04:23

标签: sql-server tsql

我一直在尝试复制SQL Server中MySql中提供的限制和范围功能,但还没有运气。我找到了几个指南,现在认为我的sql代码几乎是正确的,但我仍然在下面发布了一个错误。

  

System.Data.SqlClient.SqlException:   只能指定一个表达式   在子查询中的选择列表中   没有引入EXISTS

错误代码说要使用EXISTS,但我尝试过而不是NOT IN,我仍然会收到错误。

我的sql发布在

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

2 个答案:

答案 0 :(得分: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 +@limit;

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

答案 1 :(得分:0)

另一种(类似的,慢的:))方式

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