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

Откуда:
Сообщений: 179
Добрый день!
Есть 2 таблицы
declare @obj table (inIndex int primary key, par int, child int, rel int)
declare @new table (idlink int primary key, inIndex int, par int, child int, rel int)

Поля par, child, rel в обоих таблицах могут дублироваться.
Можно ли как-то обновить в таблице @new поле inIndex из таблицы @obj. Все остальные значения кроме индекса могут совпадать.
Если делать в лоб - то обновит только первым встретившемся индексом.
update l set l.inIndex = o.inIndex
  from @new l 
    inner join @obj o on l.Par = o.Par 
      and l.Child = o.Child 
      and l.Rel = o.Rel
9 окт 13, 10:52    [14943343]     Ответить | Цитировать Сообщить модератору
 Re: Update  [new]
Glory
Member

Откуда:
Сообщений: 104751
И в чем проблема/вопрос ?
9 окт 13, 10:54    [14943357]     Ответить | Цитировать Сообщить модератору
 Re: Update  [new]
qwerty112
Guest
Tester666
Если делать в лоб - то обновит только первым встретившемся индексом.

а нужно каким ? вторым встретившимся ? третьим ?

покажите пример данных --- и результат на этих данных, который хотите получить
9 окт 13, 10:55    [14943365]     Ответить | Цитировать Сообщить модератору
 Re: Update  [new]
Tester666
Member

Откуда:
Сообщений: 179
declare @obj table (inIndex int primary key, par int, child int, rel int)
insert into @obj values (1,2,3,4), (2,2,3,4)
select * from @obj
declare @new table (idlink int primary key, inIndex int, par int, child int, rel int)
insert into @new values (111, null, 2,3,4), (112, null, 2,3,4)
select * from @new

  update l set l.inIndex = o.inIndex
  from @new l 
    inner join @obj o on l.Par = o.Par 
      and l.Child = o.Child 
      and l.Rel = o.Rel
select * from @new

Все строки обновятся первым индексом. Это неверно. Количество строк в таблицах одинаково. Нужно разнести разные индексы по таблице @new.
9 окт 13, 11:23    [14943548]     Ответить | Цитировать Сообщить модератору
 Re: Update  [new]
qwerty112
Guest
Tester666,

;with 
l as (select *, row_number()over(partition by Par,Child,Rel order by (select 1)) as rn from @new),
o as (select *, row_number()over(partition by Par,Child,Rel order by (select 1)) as rn from @obj)

  update l set l.inIndex = o.inIndex
  from l 
    inner join o on l.Par = o.Par 
      and l.Child = o.Child 
      and l.Rel = o.Rel
	  and l.rn = o.rn
select * from @new
9 окт 13, 11:29    [14943607]     Ответить | Цитировать Сообщить модератору
 Re: Update  [new]
Tester666
Member

Откуда:
Сообщений: 179
Работает, спасибо!
9 окт 13, 12:53    [14944236]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить