Я столкнулся с проблемой, на самом деле я использую такой запрос:
SELECT *
FROM
(SELECT
ROW_NUMBER() OVER() as VAL_RRN,
T1.FIELD1 AS FIELD1,
T1.FIELD2 AS FIELD2
FROM
MYTABLE1 AS T1) AS subquery
WHERE
VAL_RRN >= X
FETCH FIRST 10 ROWS ONLY
Этот запрос используется для одновременного отображения пользователю 10 результатов, а переменная X
используется с системой прокрутки, чтобы пользователь мог перемещаться по результатам.
Этот запрос работает хорошо (но я не знаю, лучший ли это способ сделать это).
В любом случае, то, что мне на самом деле нужно сделать, немного отличается:
SELECT *
FROM
(SELECT
ROW_NUMBER() OVER() as VAL_RRN,
T1.FIELD1 AS FIELD1,
T1.FIELD2 AS FIELD2,
COALESCE((SELECT '1'
FROM MYTABLE1 AS T2
WHERE T1.FIELD1 = T2.FIELD2 FETCH FIRST ROW ONLY), '0') AS FIELD3 FROM MYTABLE1 AS T1) AS subquery
WHERE
VAL_RRN >= X
FETCH FIRST 10 ROWS ONLY
Предложение COALESCE
используется, чтобы узнать, ссылаются ли на одну строку другие строки.
В MYTABLE1
FIELD1
является первичным ключом, а FIELD2
является внешним ключом, определенным с помощью:
CONSTRAINT CONSTRAINT_NAME FOREIGN KEY
(FIELD2) REFERENCES MYTABLE (FIELD1) ON DELETE SET NULL
таблица MYTABLE
может иметь строку, которая ссылается на другие строки.
Но когда я использую второй тип запроса, фактическое значение row_number() over()
совершенно случайно, и я не знаю, почему. Я пытался использовать VALUE()
вместо COALESCE()
, но это не работает, есть идеи?
Какой у вас релиз и TR#?
Я использую RPG для отображения данных, и у меня выпуск V7R2M0 с уровнем TR: 7.
Вы должны использовать row_number() over(order by ...)
.
В противном случае перечисление строк непредсказуемо.
На самом деле, вы должны использовать какой-то другой способ подкачки, не повторяя один и тот же запрос, если это возможно. Этот способ прост в реализации, но может не подойти для большого количества пользователей/объема данных. Вместо этого попробуйте использовать прокручиваемый курсор.
Я попробую использовать DECLARE CURSORNAME SENSITIVE DYNAMIC SCROLL CURSOR
, но разве это не блокирует данные, если несколько пользователей работают с одними и теми же данными?
Это зависит от используемого вами уровень изоляции. Если вы знаете, как другие пользователи получают доступ к вашим таблицам, таблица Совместимость типов замков может помочь вам понять влияние...
В этом случае вы можете подумать, использовать ли RRN(T1)
вместо ROW_NUMBER()
.
Но, как сказал Марк Б., вы всегда должны использовать предложение ORDER BY с ROW_NUMBER()
, чтобы предотвратить непредсказуемую последовательность возвращаемых строк. Если нет подходящего столбца для заказа, вы можете ORDER BY RRN(T1)
.
RRN(T1)
значения могут быть непоследовательными, поэтому его значения также необходимо перенумеровать. Более того, эта функция существует только в DB2 for IBM i
. Его нет в DB2 for Z/OS
и Db2 for LUW
.
Повторное перечисление с помощью ROW_NUMBER() OVER(ORDER BY RRN(T1)) приведет к непрерывной последовательности чисел, хотя она может не обязательно представлять последовательность прибытия. Вопрос помечен как db2-400, поэтому уместны конкретные ответы IBM i, но другим будет полезно указать, к каким платформам он относится, так что спасибо.
Вы выбираете эти данные в другую программу? Что вы используете для отображения данных? РПГ или веб-сервис?