Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Update из select  [new]
пивафви
Guest
Добрый день, уважаемые!

Есть одна проблемка, которую пока не удаётся решить: нужно выполнить UPDATE одного поля таблицы, записав в него номер сортированной строки. Вот пример выборки по нужным полям:
select
  FGROUP,
  ROW_NUMBER() over (order by FLABEL) as NewOrderNo,
  FORDER,
  FLABEL
from
  TTEST
where
  FGROUP = 1

Поле FGROUP содержит номер группы элементов, FORDER - порядковый номер в группе, FLABEL - текстовая метка. Нужно изменить порядок (значение FORDER ), записав в него значение NewOrderNo (номер строки при сортировке по полю FLABEL). Фактически, хочу сделать примерно такое:
update
  TTEST
set
  FORDER = (
    select
	  ROW_NUMBER() over (order by FLABEL) as NewOrderNo
    from
      TTEST
    where
      FGROUP = 1
  )
where
  FGROUP = 1

В данном скрипте получается ошибка:
автор
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
The statement has been terminated.
Да, понимаю - так не катит. Попытался через Merge - тоже не оно (скрипт начал выполняться, но его завершения я так и не дождался, хотя по данной выборке полей выбирается десяток из нескольких тысяч):
merge into
  TTEST
using (
  select
    FORDER,
	ROW_NUMBER() over(order by FLABEL) as NewOrderNo
  from
    TTEST
  where
    FGROUP = 1
  ) S
on
  TTEST.FORDER = S.FORDER
when matched then
  update 
set
  FORDER = S.NewOrderNo;

Подскажите пожалуйста, как сделать правильно?
5 дек 13, 14:23    [15246567]     Ответить | Цитировать Сообщить модератору
 Re: Update из select  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
В update можно писать join. Это если тупой
update TTEST set FORDER = ROW_NUMBER() over (order by FLABEL)
не проканает.
5 дек 13, 14:28    [15246608]     Ответить | Цитировать Сообщить модератору
 Re: Update из select  [new]
invm
Member

Откуда: Москва
Сообщений: 9838
with x as
(
 select FORDER, row_number() over (order by FLABEL) as rn from TTEST
)
update x
 set
  FORDER = rn;
5 дек 13, 14:34    [15246654]     Ответить | Цитировать Сообщить модератору
 Re: Update из select  [new]
пивафви
Guest
invm, огромное Вам спасибо! Это именно то, что было нужно!
5 дек 13, 15:54    [15247313]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить