I've been trying to replicate the limit and range feature provided in MySql in SQL Server with no luck as of yet. I have found several guides and now think my sql code is nearly correct but I'm still getting an error posted below.
System.Data.SqlClient.SqlException: Only one expression can be specified in the select list when the subquery is not introduced with EXISTS
The error code says to use EXISTS but i have tried that instead of NOT IN a开发者_运维知识库nd i still get an error.
My sql is posted below
SELECT TOP (@range) *
FROM client
WHERE clientId NOT IN
(SELECT TOP (@limit) *
FROM client
ORDER BY clientId)
ORDER BY clientId
The change you need to make to your code is
SELECT TOP (@range) *
FROM client
WHERE clientId NOT IN (SELECT TOP (@limit) clientId /*<-- NOT "*" here */
FROM client
ORDER BY clientId)
ORDER BY clientId
This can also be done by using row_number
as below (which performs better depends on the different indexes available and how wide a covering index on the whole query is compared to a narrow one on just 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
Another (similar, slower :) ) way
SELECT * FROM (
select rank() over (ORDER BY yourorder) as rank, *.X
from TableX X
) x2 WHERE rank between 5 and 10
精彩评论