Эквивалент предела для DB2



Здравствуйте LIMIT в DB2 для iSeries?



у меня есть таблица с более чем 50 000 записей, и я хочу вернуть записи от 0 до 10 000, а записи от 10 000 до 20 000.



Я знаю, что в SQL вы пишете LIMIT 0,10000 в конце запроса от 0 до 10 000 и LIMIT 10000,10000 в конце запроса для 10000 до 20000



Итак, как это делается в DB2? Что такое код и синтаксис?
(полный пример запроса приветствуется)

483   9  

9 ответов:

используя FETCH FIRST [n] ROWS ONLY:

http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=/com.ibm.db29.doc.perf/db2z_fetchfirstnrows.htm

SELECT LASTNAME, FIRSTNAME, EMPNO, SALARY
  FROM EMP
  ORDER BY SALARY DESC
  FETCH FIRST 20 ROWS ONLY;

чтобы получить диапазоны, вам придется использовать ROW_NUMBER() (начиная с v5r4) и использовать это в пределах WHERE пункт: (украдено отсюда:http://www.justskins.com/forums/db2-select-how-to-123209.html)

SELECT code, name, address
FROM ( 
  SELECT row_number() OVER ( ORDER BY code ) AS rid, code, name, address
  FROM contacts
  WHERE name LIKE '%Bob%' 
  ) AS t
WHERE t.rid BETWEEN 20 AND 25;

разработал этот метод:

вам нужна таблица, которая имеет уникальное значение, которое можно заказать.

Если вы хотите строки от 10 000 до 25 000 и ваша таблица имеет 40 000 строк, сначала вам нужно получить начальную точку и общее количество строк:

int start = 40000 - 10000;

int total = 25000 - 10000;

а затем передать их по коду в запрос:

SELECT * FROM 
(SELECT * FROM schema.mytable 
ORDER BY userId DESC fetch first {start} rows only ) AS mini 
ORDER BY mini.userId ASC fetch first {total} rows only

недавно в DB2 для i 7.1 и 7.2 была добавлена поддержка смещения и ограничения. Вам нужны следующие уровни группы DB PTF, чтобы получить эту поддержку:

  • SF99702 Уровень 9 для IBM i 7.2
  • SF99701 уровень 38 для IBM i 7.1

смотрите здесь для получения дополнительной информации: смещение и ограничение документация, DB2 for i Enhancement Wiki

вот решение, которое я придумал:

select FIELD from TABLE where FIELD > LASTVAL order by FIELD fetch first N rows only;

инициализируя LASTVAL до 0 (или " для текстового поля), а затем устанавливая его на последнее значение в самом последнем наборе записей, это будет проходить через таблицу в кусках N записей.

@elcool это - это умная идея, но вам нужно знать общее количество строк (которые могут меняться во время выполнения запроса!). Поэтому я предлагаю модифицированную версию, которая, к сожалению, нуждается в 3 подзапросах вместо 2:

select * from (
    select * from (
        select * from MYLIB.MYTABLE
        order by MYID asc 
        fetch first {last} rows only 
        ) I 
    order by MYID desc
    fetch first {length} rows only
    ) II
order by MYID asc

здесь {last} должен быть заменен на номер строки последней записи мне нужно и {length} должен быть заменен на количество строк, которое мне нужно, рассчитанное как last row - first row + 1.

например, если я хочу строки от 10 до 25 (всего 16 строк), {last} будет 25 и {length} будет 25-10+1=16.

вы также должны рассмотреть предложение OPTIMIZE FOR n ROWS. Более подробно обо всем этом в документации DB2 LUW в рекомендации по ограничению операторов SELECT темы:

  • предложение OPTIMIZE FOR объявляет намерение получить только подмножество результата или предоставить приоритет получению только первых нескольких строк. Затем оптимизатор может выбрать планы доступа, которые минимизируют время отклика для получения первых нескольких строк.

есть 2 решения для эффективного разбиения на страницы в таблице DB2:

1-метод, использующий функцию row_number () и предложение, над которым было представлено на другой записи ("SELECT row_number () OVER (ORDER BY ... )"). На некоторых больших столах я замечал иногда ухудшение выступлений.

2 - техника с помощью прокручиваемого курсора. Реализация зависит от используемого языка. Эта техника кажется более надежной на больших столах.

I представил 2 методики, реализованные на PHP во время семинара в следующем году. Слайд доступен по этой ссылке : http://gregphplab.com/serendipity/uploads/slides/DB2_PHP_Best_practices.pdf

Извините, но этот документ только по-французски.

есть эти доступные опции: -

DB2 has several strategies to cope with this problem.
You can use the "scrollable cursor" in feature.
In this case you can open a cursor and, instead of re-issuing a query you can FETCH forward and backward.
This works great if your application can hold state since it doesn't require DB2 to rerun the query every time.
You can use the ROW_NUMBER() OLAP function to number rows and then return the subset you want.
This is ANSI SQL 
You can use the ROWNUM pseudo columns which does the same as ROW_NUMBER() but is suitable if you have Oracle skills.
You can use LIMIT and OFFSET if you are more leaning to a mySQL or PostgreSQL dialect.  

попробуй такое

SELECT * FROM
    (
        SELECT T.*, ROW_NUMBER() OVER() R FROM TABLE T
    )
    WHERE R BETWEEN 10000 AND 20000

Comments

    Ничего не найдено.