Как создать поле автоматического увеличения в запросе выбора

84

Например, у меня есть таблица с 2 столбцами, first_nameи last_nameс этими значениями

Ali           Khani
Elizabette    Amini
Britney       Spears
,...

Я хочу написать selectзапрос, который генерирует такую ​​таблицу:

1     Ali           Khani
2     Elizabette    Amini
3     Britney       Spears
,...

Спасибо за вашу помощь.

wf Khani
источник
1
Какую СУБД вы используете?
peterm

Ответы:

147

Если это MySql, вы можете попробовать

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

SQLFiddle

А для SQLServer

SELECT row_number() OVER (ORDER BY first_name, last_name) n,
       first_name, 
       last_name 
  FROM table1 

SQLFiddle

Петерм
источник
1
Что, если я хочу выбрать table1вместо этого все столбцы first_nameи last_nameкак я могу ссылаться на все? Попытка SELECT @n := @n + 1 n, *не работает
PlainOldProgrammer
ОтветSELECT @n := @n + 1 n, table1.*
PlainOldProgrammer
1
В MYSQL вам может потребоваться инициализировать @n: SET @n = 0;
Francisco R,
2
@FranciscoR Присмотритесь, он уже инициализирован в подзапросе (SELECT @n := 0). Скрытая прелесть этого подхода в том, что у вас есть один оператор вместо двух, что хорошо, когда несколько операторов запрещены в вашем клиентском коде.
peterm
33

вот для SQL server, Oracle, PostgreSQLкаких оконных функций поддержки.

SELECT  ROW_NUMBER() OVER (ORDER BY first_name, last_name)  Sequence_no,
        first_name,
        last_name
FROM    tableName
Джон Ву
источник
4

В случае, если у вас нет естественного значения раздела и вы просто хотите упорядоченное число независимо от раздела, вы можете просто указать row_number вместо константы, в следующем примере я только что использовал 'X'. Надеюсь, это кому-то поможет

select 
    ROW_NUMBER() OVER(PARTITION BY num ORDER BY col1) as aliascol1, 
    period_next_id, period_name_long
from 
(
  select distinct col1, period_name_long, 'X' as num
  from {TABLE} 
) as x
Balgar Jagpal
источник
1
DECLARE @id INT 
SET @id = 0 
UPDATE cartemp
SET @id = CarmasterID = @id + 1 
GO
Dev3
источник