Як сформувати поле автоматичного збільшення в запиті вибору


84

Наприклад, у мене є таблиця з 2 стовпцями first_nameі last_nameз цими значеннями

Ali           Khani
Elizabette    Amini
Britney       Spears
,...

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

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

Спасибі за вашу допомогу.


1
Які СУБД ви використовуєте?
петерм

Відповіді:


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


4

У випадку, якщо у вас немає природного значення розділу і вам просто потрібне впорядковане число, незалежно від розділу, ви можете просто зробити рядок_число над константою, у наступному прикладі я щойно використав "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

1
DECLARE @id INT 
SET @id = 0 
UPDATE cartemp
SET @id = CarmasterID = @id + 1 
GO
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.