Аналог LIMIT в MSSQL

    Так уж сложилось что MSSQL не имеет своего аналога функции LIMIT в MySQL (за исключением TOP). Но достаточно часто возникает необходимость выбрать определенный интервал значений не с первого а например с 1000-го.


    Существует несколько возможных вариантов:

    1. Выбираем значения от первого и до последнего нужного, передаем их в скрипт и уже там обрезаем при выводе те что нам не нужны .

    SELECT TOP n * FROM TABLE ORDER BY id
    n — номер последнего элемента
    id — уникальный идентификатор

    При роботе с большими таблицами очень долго исполняется, годится только для маленьких таблиц

    2. Делаем выборку с условием не вхождения по признаку

    SELECT TOP n id,* FROM TABLE
    WHERE id not in (SELECT TOP (n - m) id FROM TABLE)
    ORDER BY id

    n — номер последнего элемента
    m — необходимое количество элементов
    id — уникальный идентификатор

    Работает в некоторых случаях немного быстрее первого метода и годится для обработки достаточно больших таблиц при условии не сложного запроса

    3. Наконец последний способ с использованием row_number(), наиболее быстро работающий практически с любыми таблицами

    WITH num_row
    AS
    (
    SELECT row_number() OVER (ORDER BY id) as nom , *
    FROM TABLE
    )
    SELECT * FROM num_row
    WHERE nom BETWEEN (n - m) AND n

    n — номер последнего элемента
    m — необходимое количество элементов
    id — уникальный идентификатор

    Вчера был замечен небольшой парадокс выборка способом 3 работала гораздо быстрее чем просто SELECT TOP n с той-же таблицы (в которой больше 60млн. строк).

    P.S. Это мой первый топик на хабре, прошу не судить строго.
    Реклама
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее

    Комментарии 6

      +1
      Вы молодец, что написали статью!
      Но…
      Для интересующихся вопросом хочу сказать, что в faq с sql.ru этот вопрос разобран куда лучше
        0
        Но все же я на sql.ru не нашел достаточно простого и быстро работающего способа для роботы с большими таблицами, хотя там и есть очень много полезной информации по этому поводу.
        –2
        А в чем проблема с выбором записей не с начала? имеется в MySQL такое.… LIMIT [сколько],[начиная с]
          +2
          сорри. не правильно понял топик. проблема с MSSQL оказывается тут
            0
            В том то и дело что в MySQL проблем нет а тут приходится изобретать велосипед
              –1
              Зато мне нравиться как в базах данных MS Access сделана команда TRANSFORM. В MySQL для подобного запроса нужно еще похуже приёмы делать

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое