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

Откуда:
Сообщений: 2083
Здравствуйте! Есть таблица
idxValData
10NULLNULL
20Значение 12013-05-14 00:00:00.000

Надо скопировать Val и Data из строки, где idx=20, в строку с idx=10, чтобы получилось
idxValData
10Значение 12013-05-14 00:00:00.000
20Значение 12013-05-14 00:00:00.000

Моя неудачная попытка
declare @t table (idx int, Val varchar(50), Data datetime)
insert @t select 10, null, null union all select 20, 'Значение 1', '20130514'
select * from @t

;with a as (
  select t1.Val, t1.Data, t2.NewVal, t2.NewData
  from @t t1
  cross join (select Val [NewVal], Data [NewData] from @t t2 where idx = 20) t2
  where t1.idx = 10
)
update a set Val = NewVal, NewData = Data

SQL 2005
16 май 13, 09:51    [14303442]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с Update  [new]
Glory
Member

Откуда:
Сообщений: 104751
Просто соединить таблицу с собой в update
Вот только что будет при наличии множества записей с idx=20 и idx=10 ?
16 май 13, 09:55    [14303457]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с Update  [new]
user89
Member

Откуда:
Сообщений: 2083
Glory,
в реальной таблице ID уникальный.

Glory
Просто соединить таблицу с собой в update
Так и начал, но idx у строк разный. Пробовал еще через Left Join. Select выдает нужные значения, но при Update получил ошибку Таблица "@t" неоднозначна
update @t set Val = t2.Val, Data = t2.Data
--select *
from @t t1
left join @t t2 on (t1.idx = t2.idx) or (t1.idx = 10 and t2.idx = 20)
where t1.idx = 10 and t2.idx = 20
16 май 13, 10:19    [14303620]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с Update  [new]
Glory
Member

Откуда:
Сообщений: 104751
update t1 set Val = t2.Val, Data = t2.Data
--select *
from @t t1
left join @t t2 on t1.idx = t2.idx and t1.idx = 10 and t2.idx = 20
16 май 13, 10:21    [14303627]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с Update  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
update t1
set t1.val = t2.val
  , t1.data = t2.data
from @t t1 inner join @t t2 on t1.idx + 10 = t2.idx
16 май 13, 10:23    [14303639]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с Update  [new]
user89
Member

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

всё превратилось в NULL :(

Knyazev Alexey,
увы, idx в реальной базе напоминает GUID (смесь цифр и букв A-Z)

Решил так:
update t1 set Val = t2.Val, Data = t2.Data
--select t1.Val, t1.Data, t2.Val, t2.Data
from @t t1
cross join (select Val, Data from @t where idx = 20) t2
where idx = 10

Всем спасибо за обсуждение!
16 май 13, 10:37    [14303724]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с Update  [new]
Glory
Member

Откуда:
Сообщений: 104751
user89
Решил так:

Ваше решение для таблицы из двух записей
16 май 13, 10:38    [14303736]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с Update  [new]
user89
Member

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

ну да. В реальности, постановка задачи - сложнее, но в итоге сводится к копированию из 1-й строки во 2-ю.
16 май 13, 10:41    [14303754]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с Update  [new]
user89
Member

Откуда:
Сообщений: 2083
Glory
Ваше решение для таблицы из двух записей
Для четырех записей тоже работает
declare @t table (idx int, Val varchar(50), Data datetime)
insert @t select 10, null, null union all select 20, 'Значение 1', '20130514' union all select 25, 'Значение 3', '20130515' union all select 100, 'Значение 4', '20130516'
select * from @t

update t1 set Val = t2.Val, Data = t2.Data
--select t1.Val, t1.Data, t2.Val, t2.Data
from @t t1
cross join (select Val, Data from @t where idx = 20) t2
where idx = 10

select * from @t
16 май 13, 10:44    [14303776]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с Update  [new]
Glory
Member

Откуда:
Сообщений: 104751
user89
Для четырех записей тоже работает

А для случая, где не будет записе с idx = 10 и/или idx = 20 ?
16 май 13, 10:47    [14303793]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с Update  [new]
Glory
Member

Откуда:
Сообщений: 104751
declare @t table (idx int, Val varchar(50), Data datetime)
insert select 20, 'Значение 1', '20130514' union all select 25, 'Значение 3', null union all select 100, 'Значение 4', '20130516'
select * from @t
16 май 13, 10:48    [14303799]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить