1. SQL / Говнокод #9088

    −113

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    select o.*
    from (select rownum rw
               , o.*
          from (select o.* from all_tables o order by table_name) o
          where rownum < 20
         ) o
    where o.rw >= 10;

    Стандартный аналог "LIMIT 9,10" в Oracle.
    http://www.sql.ru/faq/faq_topic.aspx?fid=171

    Запостил: huitka, 12 Января 2012

    Комментарии (14) RSS

    • Вот это срань. Никогда бы на оракл такого не подумал. Во всех, блин, базах есть давным-давно.
      Ответить
      • в Оracle есть же ROWNUM
        Ответить
        • rownum is a pseudo column. It numbers the records in a result set.

          А это значит, что нам нужен пронумерованный резалт сет, а потом уже выбирать из него.
          Ответить
          • нет, не значит - но в любом случае придется выбрать и пропустить первых n элементов
            по-моему, подход полностью аналогичен LIMIT из MySQL
            Ответить
      • Во всех - это в мускуле?
        В MS SQL Server абсолютно идентичный подход, как в Оракле.

        А чем не нравится, собственно, версия с подзапросом? Только удобством использования? Сомнительный аргумент.
        Ответить
        • MS SQL:
          SELECT t3.row, t1.* FROM all_tables t1
          INNER JOIN
          (
          SELECT ROW_NUMBER() OVER (ORDER BY t2.ID) row, t2.ID
          FROM all_tables t2
          ) t3 ON t1.ID=t3.ID
          WHERE t3.row > 10 AND t3.row < 20

          Или аналогично можно сделать с условием WHERE t1.ID IN (...), но тогда номера строк не получится вывести. Согласен, что подход идентичный.
          Ответить
        • > это в мускуле?
          Db2, Postgres, Firebird. Хотя, в фиребёрде всё сделано через жопу. Там фетч не влияет на выбираемый сет. запрос выполняется весь, а потом от него откусывается нужное число строк.

          > А чем не нравится
          Обычно, подзапросы тормозят. Плюс, см. выше, нафиг нам такое счастье, получать пронумерованный сет на стопицот тысяч миллионов строк, дабы выбрать первые три?

          Такой паровоз не полетит.
          Ответить
          • сколько можно этот боян вспоминать?
            http://troels.arvin.dk/db/rdbms/#select-limit
            Ответить
            • Плюсанул.
              Спасибо, что прервали ДБсрач.
              Только замечу, что в представленной ссылке, не рассматриваются более тяжелые случаи, когда надо выбрать строки с N по M, а только выборка первых N строк.
              Ответить
              • когда я первый раз об этом спорил, нагугливался текст потолще, возможно оно там
                Ответить
              • Отнюдь, сэр. Это не срач, а обмен точками зрений.
                Ответить
                • >Это не срач, а обмен точками зрений.
                  Угу. Причем очень познавательный.

                  >не рассматриваются более тяжелые случаи,
                  >выбрать строки с N по M
                  Всё там рассматривается, просто надо внимательно рассматривать.
                  Limit—with offset

                  Правда в моём случае оно не помогает, ибо An ORDER BY clause is not allowed in a derived table.

                  Ответить
    • Немножко подправить и все ок.
      select * from (
          select o.*, row_number() over (order by price) rw
            from all_tables o
        ) where rw between 10 and 20;
      Ответить

    Добавить комментарий