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

Откуда:
Сообщений: 33
всем бобра,

есть таблица. есть некие 2 строки первая и вторая. нужно удалить первую строку а ее значения переписать во вторую строку.
запилил запрос

	
UPDATE t1
SET t1.Email = t2.Email
FROM TheTable t1 cross apply
	(DELETE FROM TheTable OUTPUT DELETED.* WHERE id = @id2) AS t2 
WHERE t1.id = @id1


но получаю ошибку "A nested INSERT, UPDATE, DELETE, or MERGE statement is not allowed in the FROM clause of an UPDATE or DELETE statement"

в общем какой есть красивый и быстрый по перформансу способ сделать подобный запрос , и чтобы он был атомарный (т.е. Delete\Update как единое целое)?

смог нагуглить только вариант delete->insert, а вот свой вариант найти не удалось.
18 фев 16, 02:26    [18832956]     Ответить | Цитировать Сообщить модератору
 Re: в одной таблице скопировать одну строку в другую, удалив первую  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
systemio
чтобы он был атомарный (т.е. Delete\Update как единое целое)?

SET XACT_ABORT ON
BEGIN TRAN 
...
COMMIT TRAN
18 фев 16, 03:30    [18832961]     Ответить | Цитировать Сообщить модератору
 Re: в одной таблице скопировать одну строку в другую, удалив первую  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
systemio
Delete\Update как единое целое
with s as
(
 select
  b.id, a.Email
 from
  TheTable a cross join
  (values (@id1), (@id2)) b(id)
 where
  a.id = @id2
)
merge into TheTable t
using s on s.id = t.id
when matched and s.id = @id1 then
 update set Email = s.Email
when matched and s.id = @id2 then
 delete;
18 фев 16, 09:03    [18833262]     Ответить | Цитировать Сообщить модератору
 Re: в одной таблице скопировать одну строку в другую, удалив первую  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20600
systemio
нужно удалить первую строку а ее значения переписать во вторую строку

А почему бы просто не удалить вторую? результат тот же, а телодвижений меньше...
18 фев 16, 09:21    [18833328]     Ответить | Цитировать Сообщить модератору
 Re: в одной таблице скопировать одну строку в другую, удалив первую  [new]
systemio
Member

Откуда:
Сообщений: 33
Mind
BEGIN TRAN
, ну ты просто КО )

invm
with s as
, что произойдет первым удаление или обновление. в таблице стоит ограничение на уникальность для поля Email

Akina
А почему бы просто не удалить вторую?
, потому что Id
19 фев 16, 12:11    [18840181]     Ответить | Цитировать Сообщить модератору
 Re: в одной таблице скопировать одну строку в другую, удалив первую  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
systemio
что произойдет первым удаление или обновление. в таблице стоит ограничение на уникальность для поля Email
А проверить и план посмотреть, не?
19 фев 16, 12:34    [18840379]     Ответить | Цитировать Сообщить модератору
 Re: в одной таблице скопировать одну строку в другую, удалив первую  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51282
systemio
Akina
А почему бы просто не удалить вторую?
, потому что Id

А почему бы не удалить вторую, а потом поменять Id первой?..
19 фев 16, 14:57    [18841450]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить