Perl готовит инструкцию DB2, не возвращая то, что мне нужно - PullRequest
0 голосов
/ 06 августа 2010

Поскольку я использую DB2, чтобы выбрать часть базы данных посередине (например, спаривание лимитов / смещений), мне нужно сделать оператор подготовки другого типа. Пример, который мне дали, был такой:

ВЫБРАТЬ * FROM (ВЫБРАТЬ col1, col2, col3, ROW_NUMBER () OVER () AS RN FROM таблицы) AS cols ГДЕ RN МЕЖДУ 1 И 10000;

Который я адаптировал к этому:

ВЫБРАТЬ * ОТ (ВЫБРАТЬ ROW_NUMBER () НАД (ЗАКАЗАТЬ НА 2,3,4,6,7 ASC) КАК rownum ОТ ОПЕРАЦИЙ) КАК ГДЕ ГДЕ rownum> = 500 И rownum <1000 </p>

И когда я вызываю fetchall_arrayref (), я получаю 500 результатов, как хочу, но он возвращает только массив со ссылками на номер строки, а не все данные, которые я хочу получить. Я точно знаю, что именно этот код ПРЕДЛАГАЕТ делать так, как написано, и я попробовал несколько перестановок, чтобы получить желаемый результат без удачи.

Все, что я хочу, - это собрать все столбцы, как и мой предыдущий оператор prepare, в массив массивов: ВЫБРАТЬ * ОТ TU_TRANSACTIONS ЗАКАЗАТЬ НА 2, 3, 4, 6, 7

но только в указанном разделе. Есть просто фундаментальная вещь, по которой я скучаю, и я просто не вижу ее.

Любая помощь приветствуется, даже если она сопряжена с конструктивной критикой.

Ответы [ 2 ]

1 голос
/ 06 августа 2010

Ваше табличное выражение:

(ВЫБРАТЬ ROW_NUMBER () НАД (ЗАКАЗАТЬ НА 2,3,4,6,7 ASC) AS rownum ОТ ОПЕРАЦИЙ) как foo

Имеет только один столбец - rownum - поэтому, когда вы выбираете «*» из «foo», вы получаете только один столбец.

Ваше табличное выражение должно включать в себя все нужные вам столбцы, как в примере, который вы опубликовали.

0 голосов
/ 06 августа 2010

Я не использую DB2, поэтому я могу быть вне базы, но мне кажется, что:

SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY 2,3,4,6,7 ASC) AS rownum FROM TRANSACTIONS) AS foo WHERE rownum >= 500 AND rownum <1000

Возвращает только номера строк, потому что, хотя подзапрос ссылается на таблицу, основной запрос этого не делает. Все, что кажется, это было бы видеть набор чисел (который возвратил бы единственный столбец с заполненным числом)

Возможно, это сработает:

SELECT * FROM TRANSACTIONS, (SELECT ROW_NUMBER() OVER (ORDER BY 2,3,4,6,7 ASC) AS rownum FROM TRANSACTIONS) AS foo WHERE rownum >= 500 AND rownum <1000
...