Использование ROW_NUMBER () OVER () в подзапросе - PullRequest
0 голосов
/ 21 мая 2019

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

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(), но, похоже, это не работает, есть идеи?

Ответы [ 2 ]

2 голосов
/ 21 мая 2019

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

0 голосов
/ 22 мая 2019

В этом случае вы можете подумать, следует ли использовать RRN(T1) вместо ROW_NUMBER().

Но, как сказал Марк Б, вы всегда должны использовать предложение ORDER BY с ROW_NUMBER(), чтобы предотвратитьнепредсказуемая последовательность строк вернулась.Если нет подходящего столбца для заказа, вы можете ORDER BY RRN(T1).

...