Использование ROW_NUMBER() OVER() в подзапросе

Я столкнулся с проблемой, на самом деле я использую такой запрос:

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 используется, чтобы узнать, ссылаются ли на одну строку другие строки.

В MYTABLE1FIELD1 является первичным ключом, а FIELD2 является внешним ключом, определенным с помощью:

CONSTRAINT CONSTRAINT_NAME FOREIGN KEY                            
  (FIELD2) REFERENCES MYTABLE (FIELD1) ON DELETE SET NULL

таблица MYTABLE может иметь строку, которая ссылается на другие строки.

Но когда я использую второй тип запроса, фактическое значение row_number() over() совершенно случайно, и я не знаю, почему. Я пытался использовать VALUE() вместо COALESCE(), но это не работает, есть идеи?

Вы выбираете эти данные в другую программу? Что вы используете для отображения данных? РПГ или веб-сервис?

Michael S. 21.05.2019 19:30

Какой у вас релиз и TR#?

WarrenT 21.05.2019 23:21

Я использую RPG для отображения данных, и у меня выпуск V7R2M0 с уровнем TR: 7.

RegisPierre 22.05.2019 10:25
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
3
352
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы должны использовать row_number() over(order by ...).
В противном случае перечисление строк непредсказуемо.

На самом деле, вы должны использовать какой-то другой способ подкачки, не повторяя один и тот же запрос, если это возможно. Этот способ прост в реализации, но может не подойти для большого количества пользователей/объема данных. Вместо этого попробуйте использовать прокручиваемый курсор.

Mark Barinstein 22.05.2019 11:13

Я попробую использовать DECLARE CURSORNAME SENSITIVE DYNAMIC SCROLL CURSOR, но разве это не блокирует данные, если несколько пользователей работают с одними и теми же данными?

RegisPierre 22.05.2019 11:54

Это зависит от используемого вами уровень изоляции. Если вы знаете, как другие пользователи получают доступ к вашим таблицам, таблица Совместимость типов замков может помочь вам понять влияние...

Mark Barinstein 22.05.2019 12:05

В этом случае вы можете подумать, использовать ли 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.
Mark Barinstein 22.05.2019 11:11

Повторное перечисление с помощью ROW_NUMBER() OVER(ORDER BY RRN(T1)) приведет к непрерывной последовательности чисел, хотя она может не обязательно представлять последовательность прибытия. Вопрос помечен как db2-400, поэтому уместны конкретные ответы IBM i, но другим будет полезно указать, к каким платформам он относится, так что спасибо.

WarrenT 28.05.2019 15:14

Другие вопросы по теме