Столбец обновления последовательности SQL в обратном порядке - PullRequest
1 голос
/ 30 октября 2019

Я пытаюсь обновить столбец cohort_number в таблице с последовательными значениями от 1 до x (в данном случае 42), используя последовательность, как показано ниже.

CREATE SEQUENCE seq start with 1 increment by 1 no maxvalue no cycle

UPDATE t1
SET cohort_number = next value for seq, instance_number = x.instanceNumber 
FROM 
( 
    SELECT id, 
    1 instanceNumber 
    FROM t1
) x 

DROP SEQUENCE seq

Однако при обновлении, а непервая строка cohort_number = 1, вторая строка = 2 и т. д., первая строка cohort_column = 42, вторая строка cohort_column = 2. Т.е. кажется, что обновление обрабатывается из последней записи в результате выбора, а не из первой. Есть ли что-нибудь вокруг этого?

Я также пробовал с ROW_NUMBER, как показано ниже, но каждое значение для cohort_column установлено в 1, что, я считаю, связано с тем, что id не имеет повторяющихся значений (но я 'я угадал здесь)

UPDATE t1
SET cohort_number = x.cohort_number, instance_number = x.instance_number 
FROM 
( 
    SELECT id, 
    ROW_NUMBER() over (order by id) as cohort_number,
    1 instance_number 
    FROM t1
) x

Ответы [ 2 ]

2 голосов
/ 30 октября 2019

Странный и проприетарный синтаксис UPDATE ... FROM заставляет мою голову болеть.

Это:

UPDATE t1
SET cohort_number = x.cohort_number, instance_number = x.instance_number 
FROM 
( 
    SELECT id, 
    ROW_NUMBER() over (order by id) as cohort_number,
    1 instance_number 
    FROM t1
) x

Не работает, потому что вы обновляете T1, не коррелируя егос х, и вы не обновляете х. Либо будет работать.

Мне гораздо проще написать запрос SELECT, который возвращает все строки, которые будут обновлены, а также новые значения для столбцов, которые будут обновлены. Затем обновите это:

with x as
(
    SELECT id, 
    cohort_number
    instance_number,
    ROW_NUMBER() over (order by id) as new_cohort_number,
    1 new_instance_number 
    FROM t1
)
update x set cohort_number = new_cohort_number, instance_number = new_instance_number
2 голосов
/ 30 октября 2019

Зачем вам использовать последовательность для этого? Просто используйте row_number():

UPDATE toupdate
    SET cohort_number = seqnum,
        instance_number = new_instanceNumber 
    FROM (SELECT t1.*, ROW_NUMBER() OVER (ORDER BY id DESC) as seqnum
                 1 as new_instanceNumber 
          FROM t1
         ) toupdate;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...