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

Откуда:
Сообщений: 58
Подскажите, пожалуйста, есть задача: добавить новую запись в таблицу или проапдейтить дату у существующей строки.

Это надо следать для двух юзеров @CreatorId и @RequestorId, либо если они сопадают, то один раз

MERGE [Message] t
USING (
	SELECT ProjectId = @ProjectId, Message = @Message, Date = @Date, UserId = @RequestorId
	UNION 
	SELECT ProjectId = @ProjectId, Message = @Message, Date = @Date, UserId = @CreatorId
	) s on t.UserId = s.UserId AND t.ProjectId = s.ProjectId
WHEN MATCHED 
THEN UPDATE
        SET t.LatestMessageDate = @Date,
              t.Message = @Message
WHEN NOT MATCHED BY TARGET
THEN INSERT (ProjectId, UserId, Message, LatestMessageDate)
     VALUES (@ProjectId, @UserId, @Message, @Date)


В юзинге можно как-то ещё условие сделать для одной записи или двух? Или надо только темповую таблицу создавать и ее уже использовать?

Заранее спасибо.

Сообщение было отредактировано: 9 июн 21, 17:30
9 июн 21, 17:36    [22333445]     Ответить | Цитировать Сообщить модератору
 Re: MERGE запрос  [new]
Кесарь
Member

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

ну посмотрите сами, что вы написали.

1. У вас есть блок подготовки данных, но он никак не используется. Вы и записываете, и апдейтите поля переменными, а не полями блока. Зачем в этом блоке "Message = @Message, Date = @Date" тогда?

Я не говорю, что это не будет работать, скорее всего будет. Но возможно не так, как вы ожидаете.

Но в любом случае код надо писать так, чтобы было всё чётко, понятно, не было лишнего и паразитного. И понятно не только вам. Он должен быть не только работоспособным, но и быть внутренне логически выверенным.


2. Затем. В случае если @CreatorId и @RequestorId совпадают, конструкция

SELECT ProjectId = @ProjectId, Message = @Message, Date = @Date, UserId = @RequestorId
UNION 
SELECT ProjectId = @ProjectId, Message = @Message, Date = @Date, UserId = @CreatorId

выдаст одну строку. Вроде оно вам так и нужно, но что за извратный способ?!

Пишите тоже самое через условия и всё. Тем более, если у вас уже готовые переменные начитаны.

if @CreatorId = @RequestorId
begin
  update [Message] SET
    LatestMessageDate = @Date,
    Message = @Message
  where UserId = @CreatorId
    and ProjectId = @ProjectId ;
end
else
begin
  insert into [Message] (ProjectId, UserId, Message, LatestMessageDate)
    values (@ProjectId, @CreatorId, @Message, @Date), (@ProjectId, @RequestorId, @Message, @Date)
end;



P.S. Никогда не используйте заглавные буквы в командах и операторах. Это просто ужасно и моветон.

Сообщение было отредактировано: 9 июн 21, 17:50
9 июн 21, 17:55    [22333458]     Ответить | Цитировать Сообщить модератору
 Re: MERGE запрос  [new]
invm
Member

Откуда: Москва
Сообщений: 9778
lsk
В юзинге можно как-то ещё условие сделать для одной записи или двух? Или надо только темповую таблицу создавать и ее уже использовать?
Ничего дополнительно делать не надо. У вас и так подзапрос в using вернет одну или две строки.
Далее merge сделает что нужно.
9 июн 21, 18:03    [22333461]     Ответить | Цитировать Сообщить модератору
 Re: MERGE запрос  [new]
lsk
Member

Откуда:
Сообщений: 58
Кесарь, согласен в селектах лишние поля.

Я наверное непонятно описал задачу.
Мне нужно добавить или проапдейтить записать для каждого из этих двух юзеров, для кого-то запись уже может быть, а для кого-то нет, они не связаны.
9 июн 21, 18:05    [22333464]     Ответить | Цитировать Сообщить модератору
 Re: MERGE запрос  [new]
lsk
Member

Откуда:
Сообщений: 58
invm, а как может вернуться одна строка? если они будут одинаковые, то там сделается дистинкт?
9 июн 21, 18:07    [22333470]     Ответить | Цитировать Сообщить модератору
 Re: MERGE запрос  [new]
Кесарь
Member

Откуда:
Сообщений: 653
lsk
invm, а как может вернуться одна строка? если они будут одинаковые, то там сделается дистинкт?


Типа того.

Читайте документацию по оператору union и обратите внимание на его параметр all.
9 июн 21, 18:10    [22333474]     Ответить | Цитировать Сообщить модератору
 Re: MERGE запрос  [new]
lsk
Member

Откуда:
Сообщений: 58
Всем спасибо.
9 июн 21, 18:33    [22333486]     Ответить | Цитировать Сообщить модератору
 Re: MERGE запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47101
Кесарь
P.S. Никогда не используйте заглавные буквы в командах и операторах. Это просто ужасно и моветон.
Это что за новости? Всю жизнь писал ключевые слова SQL заглавными буквами.
Никогда не говори "Никогда"!
9 июн 21, 19:01    [22333501]     Ответить | Цитировать Сообщить модератору
 Re: MERGE запрос  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1781
iap
Кесарь
P.S. Никогда не используйте заглавные буквы в командах и операторах. Это просто ужасно и моветон.
Это что за новости? Всю жизнь писал ключевые слова SQL заглавными буквами.
Никогда не говори "Никогда"!


плюсую, всегда использую upper case для всех ключевых слов в tsql

даешь холивар на применение синтаксиса!
9 июн 21, 19:04    [22333503]     Ответить | Цитировать Сообщить модератору
 Re: MERGE запрос  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8701
iap
Кесарь
P.S. Никогда не используйте заглавные буквы в командах и операторах. Это просто ужасно и моветон.
Это что за новости? Всю жизнь писал ключевые слова SQL заглавными буквами.
Никогда не говори "Никогда"!


Мда, а мужики-то не знают...
9 июн 21, 19:21    [22333512]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить