Как реплицировать диапазон и ограничение mysql в SQL Server, используя верхнее предложение - PullRequest
1 голос
/ 16 марта 2011

Я пытался воспроизвести функцию ограничения и диапазона, предоставляемую в MySql в SQL Server, но пока безуспешно. Я нашел несколько руководств и теперь думаю, что мой 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 ]

3 голосов
/ 16 марта 2011

Изменение, которое вам нужно внести в свой код:

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
0 голосов
/ 16 марта 2011

Другой (похожий, медленный :)) способ

SELECT * FROM (       
    select rank() over (ORDER BY yourorder) as rank, *.X
                from TableX X
) x2 WHERE rank between 5 and 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...