Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 обновить таблицу, задав каждой строке ROW_NUMBER  [new]
b10s
Member

Откуда:
Сообщений: 108
Здравствуйте, уважаемые!

Как обновить таблицу, задав каждому полю row_number?
Я сделал ALTER TABLE и добавил поле, куда собираюсь записать номера строк.

Вариант ALTER TABLE t1 ADD row_num int identity - не предлагать :D
25 окт 13, 11:37    [15030584]     Ответить | Цитировать Сообщить модератору
 Re: обновить таблицу, задав каждой строке ROW_NUMBER  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10436
таблица большая?
25 окт 13, 12:08    [15030830]     Ответить | Цитировать Сообщить модератору
 Re: обновить таблицу, задав каждой строке ROW_NUMBER  [new]
b10s
Member

Откуда:
Сообщений: 108
Аха :)
25 окт 13, 12:17    [15030935]     Ответить | Цитировать Сообщить модератору
 Re: обновить таблицу, задав каждой строке ROW_NUMBER  [new]
Гость333
Member

Откуда:
Сообщений: 3684
b10s
добавил поле, куда собираюсь записать номера строк.

Что такое "номер строки" и для чего он нужен в этой таблице?
25 окт 13, 12:25    [15031010]     Ответить | Цитировать Сообщить модератору
 Re: обновить таблицу, задав каждой строке ROW_NUMBER  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30711
b10s
Как обновить таблицу, задав каждому полю row_number?
Я сделал ALTER TABLE и добавил поле, куда собираюсь записать номера строк.
Теперь нужно выполнить UPDATE, присвоив полю нужное значение. Если на таблице нет ПК, уникального констрейна или индекса, то только курсором.
25 окт 13, 12:29    [15031047]     Ответить | Цитировать Сообщить модератору
 Re: обновить таблицу, задав каждой строке ROW_NUMBER  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
интересно всё-таки чем провинился identity ?
25 окт 13, 12:33    [15031071]     Ответить | Цитировать Сообщить модератору
 Re: обновить таблицу, задав каждой строке ROW_NUMBER  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3618
LexusR
интересно всё-таки чем провинился identity ?

ну ты попробуй добавь на хотябы миллиардную табличку
25 окт 13, 12:51    [15031206]     Ответить | Цитировать Сообщить модератору
 Re: обновить таблицу, задав каждой строке ROW_NUMBER  [new]
Гость333
Member

Откуда:
Сообщений: 3684
Ivan Durak,

Вы считаете, что ТС рулит миллиардными таблицами и при этом задаёт такие вопросы?
25 окт 13, 13:01    [15031291]     Ответить | Цитировать Сообщить модератору
 Re: обновить таблицу, задав каждой строке ROW_NUMBER  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
ну во первых пока про миллиард нигде разговора не было да и update в курсоре вашего миллиаода будет тоже не сахар
25 окт 13, 13:02    [15031305]     Ответить | Цитировать Сообщить модератору
 Re: обновить таблицу, задав каждой строке ROW_NUMBER  [new]
Glory
Member

Откуда:
Сообщений: 104764
LexusR
update в курсоре вашего миллиаода будет тоже не сахар

ну разве что при курсоре не будет одной транзакции
25 окт 13, 13:04    [15031331]     Ответить | Цитировать Сообщить модератору
 Re: обновить таблицу, задав каждой строке ROW_NUMBER  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10436
b10s
Аха :)


вопросов больше не имею (ц)
25 окт 13, 13:25    [15031490]     Ответить | Цитировать Сообщить модератору
 Re: обновить таблицу, задав каждой строке ROW_NUMBER  [new]
ROLpogo
Member

Откуда: Реутов
Сообщений: 213
b10s
Как обновить таблицу, задав каждому полю row_number?

Полю или записи?
25 окт 13, 13:36    [15031592]     Ответить | Цитировать Сообщить модератору
 Re: обновить таблицу, задав каждой строке ROW_NUMBER  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10436
ROLpogo
b10s
Как обновить таблицу, задав каждому полю row_number?

Полю или записи?


полю, в большой таблице
25 окт 13, 13:40    [15031624]     Ответить | Цитировать Сообщить модератору
 Re: обновить таблицу, задав каждой строке ROW_NUMBER  [new]
b10s
Member

Откуда:
Сообщений: 108
Так, потрещали и хватит ;)
Задача таки интересная. Про курсор - развивайте, тоже интересно. Пока не вижу решения.

для примера, чтобы уже мыслить конкретно, было так:

create table t1(a int, b varchar)

после
alter table t1
add c bigint

нужно занести в поле 'c' номера строк. сортировка не важна.
25 окт 13, 15:18    [15032608]     Ответить | Цитировать Сообщить модератору
 Re: обновить таблицу, задав каждой строке ROW_NUMBER  [new]
Гость333
Member

Откуда:
Сообщений: 3684
with cte as
(
   select c, row_number() over(order by (select 1)) as new_c
   from t1
)
update cte
set c = new_c
25 окт 13, 15:25    [15032665]     Ответить | Цитировать Сообщить модератору
 Re: обновить таблицу, задав каждой строке ROW_NUMBER  [new]
b10s
Member

Откуда:
Сообщений: 108
LexusR
интересно всё-таки чем провинился identity ?


да особенно ничем, просто представьте, что возможности его навесить нет.

а так, самое очевидно решение - это, конечно, identity в alter table
25 окт 13, 15:28    [15032690]     Ответить | Цитировать Сообщить модератору
 Re: обновить таблицу, задав каждой строке ROW_NUMBER  [new]
invm
Member

Откуда: Москва
Сообщений: 9114
b10s
Про курсор - развивайте, тоже интересно. Пока не вижу решения.
declare @t table (id int not null primary key, rn int null);

insert into @t
 (id)
values
 (1), (2), (3);

declare @id int, @i int = 1;

declare c cursor local for
 select id from @t;

open c;
while 1 = 1
 begin
  fetch next from c into @id;
  if @@fetch_status <> 0
   break;

  update @t set rn = @i where current of c;

  select
   @i += 1;
 end;
close c;

select * from @t;
go
25 окт 13, 16:08    [15033003]     Ответить | Цитировать Сообщить модератору
 Re: обновить таблицу, задав каждой строке ROW_NUMBER  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30711
b10s
для примера, чтобы уже мыслить конкретно, было так:
так что нибуть уникальное есть или нет?

Если нет, то только курсор как я уже говорил.
25 окт 13, 16:19    [15033107]     Ответить | Цитировать Сообщить модератору
 Re: обновить таблицу, задав каждой строке ROW_NUMBER  [new]
b10s
Member

Откуда:
Сообщений: 108
alexeyvg
b10s
для примера, чтобы уже мыслить конкретно, было так:
так что нибуть уникальное есть или нет?

Если нет, то только курсор как я уже говорил.


Нет, информации о уникальности нет.
Мне необходимо расширять все пришедшие таблицы таким полем, дабы придать им уникальности вроде id. Данных много, таблицы разношерстные. Обработка конкретных записей в итоге должна выдавать номер записи в таблице. Вот такая абстрактная задача.
25 окт 13, 16:41    [15033260]     Ответить | Цитировать Сообщить модератору
 Re: обновить таблицу, задав каждой строке ROW_NUMBER  [new]
Гость333
Member

Откуда:
Сообщений: 3684
alexeyvg
Если нет, то только курсор

Да ну... обновлять порциями по N штук, с условием "а где тут значение всё ещё равно NULL"?
Курсор вроде при этом не нужен, достаточно цикла:
declare @i int = 1, @rowcount int = 1, @n int = 10000, @max int;

while @rowcount > 0
begin
  select @max = isnull(max(c), 0)
  from t1;

  with cte as
  (
     select top(@n) c, row_number() over(order by (select 1)) + @max as new_c
     from t1
     where t1.c is null
  )
  update cte
  set c = new_c;

  set @rowcount = @@rowcount;
end;
25 окт 13, 16:42    [15033276]     Ответить | Цитировать Сообщить модератору
 Re: обновить таблицу, задав каждой строке ROW_NUMBER  [new]
b10s
Member

Откуда:
Сообщений: 108
alexeyvg,

позволю себе заметить - не только. Выше представлено решение через update , где демонстрируется логика работы этого чудного оператор в таком вот ракурсе - автоматическое сопоставление полей
25 окт 13, 16:43    [15033280]     Ответить | Цитировать Сообщить модератору
 Re: обновить таблицу, задав каждой строке ROW_NUMBER  [new]
iap
Member

Откуда: Москва
Сообщений: 46951
alexeyvg
b10s
для примера, чтобы уже мыслить конкретно, было так:
так что нибуть уникальное есть или нет?

Если нет, то только курсор как я уже говорил.
В 15032665 никакой уникальности не требуется.
Хотя в любом случае надо добавить поле с IDENTITY и не парить мозги.
25 окт 13, 16:50    [15033335]     Ответить | Цитировать Сообщить модератору
 Re: обновить таблицу, задав каждой строке ROW_NUMBER  [new]
iap
Member

Откуда: Москва
Сообщений: 46951
iap
alexeyvg
пропущено...
так что нибуть уникальное есть или нет?

Если нет, то только курсор как я уже говорил.
В 15032665 никакой уникальности не требуется.
Хотя в любом случае надо добавить поле с IDENTITY и не парить мозги.
Вот как в дальнейшем поддерживать нумерацию, а?
Без IDENTITY практически нет приемлемого решения.
25 окт 13, 16:52    [15033344]     Ответить | Цитировать Сообщить модератору
 Re: обновить таблицу, задав каждой строке ROW_NUMBER  [new]
Гость333
Member

Откуда:
Сообщений: 3684
iap
Вот как в дальнейшем поддерживать нумерацию, а?
Без IDENTITY практически нет приемлемого решения.

Ну, раз ТС не указал версию своего SQL Server, значит, у него самая свежая. То есть добавит SEQUENCE, да и всё.
25 окт 13, 17:03    [15033448]     Ответить | Цитировать Сообщить модератору
 Re: обновить таблицу, задав каждой строке ROW_NUMBER  [new]
b10s
Member

Откуда:
Сообщений: 108
iap,

а данные изменятся не будут :)
не вылазьте за поставленные рамки задачи ;)
25 окт 13, 17:07    [15033476]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить