поле автоинкремента в операторе select запроса - PullRequest
1 голос
/ 26 апреля 2019

У меня есть таблица с 2 столбцами, именем и идентификатором со следующими значениями

Имя Student_ID домкрат 231
Дэйв 425
Майк 001
лилия 128
Лиам 358

Я хотел бы добавить новый столбец к этому результату с автоматически увеличенными значениями последовательности.

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

Запрос:

    SELECT @n := @n +1 n,
           name, 
           id
      FROM table1, (SELECT @n := 0) m
     ORDER BY id

    Error: 
    ERROR:  syntax error at or near ":="
    LINE 2: SELECT @n := @n +1 n,

Ожидаемый результат:

    Name  Student_ID  Serial
     jack      231      1    
     dave      425      2
     mike      001      3  
     lily      128      4 
     liam      358      5

Ответы [ 4 ]

1 голос
/ 26 апреля 2019

использование row_number()

select name, student_id, row_number() over(order by student_id) as serial
from tablename
0 голосов
/ 26 апреля 2019

Ваш код на самом деле выглядит для меня как MySQL, а не как Postgres.Я получаю сообщение об ошибке на Postgres, но Postgres обычно не позволяет использовать пользовательские переменные в обычных SQL-запросах.При выполнении вашего запроса к MySQL я получаю сообщение об ошибке, что столбец id не существует.

Но, в любом случае, Postgres долгое время поддерживал аналитическую функцию ROW_NUMBER, поэтому просто используйтечто вместо:

SELECT
    Name,
    Student_ID,
    ROW_NUMBER() OVER (ORDER BY Student_ID) Serial
FROM table1
ORDER BY
    Student_ID;
0 голосов
/ 26 апреля 2019

используйте row_number, он работает на Postgres

select *, row_number() over(order by id) as serial from table1

Ваш код @n := @n + 1 - это обходной путь MySQL из-за отсутствия оконных функций (например, row_number) в его старых версиях.Последний MySQL теперь имеет функции управления окнами.Вы можете просто использовать row_number, без необходимости обходного пути.

И вам даже не нужно это обходное решение в Postgres.Он имеет функции управления окнами задолго до почти всех

0 голосов
/ 26 апреля 2019

попробуй с row_number()

SELECT row_number()over(order by id) n,
           name, 
           id
      FROM table1 
     ORDER BY id
...