powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / MERGE запрос
10 сообщений из 10, страница 1 из 1
MERGE запрос
    #40076695
lsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lsk
Гость
Подскажите, пожалуйста, есть задача: добавить новую запись в таблицу или проапдейтить дату у существующей строки.

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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)



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

Заранее спасибо.
...
Рейтинг: 0 / 0
MERGE запрос
    #40076701
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lsk,

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

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

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

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


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

Код: sql
1.
2.
3.
SELECT ProjectId = @ProjectId, Message = @Message, Date = @Date, UserId = @RequestorId
UNION 
SELECT ProjectId = @ProjectId, Message = @Message, Date = @Date, UserId = @CreatorId


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

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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. Никогда не используйте заглавные буквы в командах и операторах. Это просто ужасно и моветон.
...
Рейтинг: 0 / 0
MERGE запрос
    #40076703
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lsk
В юзинге можно как-то ещё условие сделать для одной записи или двух? Или надо только темповую таблицу создавать и ее уже использовать?
Ничего дополнительно делать не надо. У вас и так подзапрос в using вернет одну или две строки.
Далее merge сделает что нужно.
...
Рейтинг: 0 / 0
MERGE запрос
    #40076705
lsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lsk
Гость
Кесарь, согласен в селектах лишние поля.

Я наверное непонятно описал задачу.
Мне нужно добавить или проапдейтить записать для каждого из этих двух юзеров, для кого-то запись уже может быть, а для кого-то нет, они не связаны.
...
Рейтинг: 0 / 0
MERGE запрос
    #40076708
lsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lsk
Гость
invm, а как может вернуться одна строка? если они будут одинаковые, то там сделается дистинкт?
...
Рейтинг: 0 / 0
MERGE запрос
    #40076712
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lsk
invm, а как может вернуться одна строка? если они будут одинаковые, то там сделается дистинкт?


Типа того.

Читайте документацию по оператору union и обратите внимание на его параметр all.
...
Рейтинг: 0 / 0
MERGE запрос
    #40076724
lsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lsk
Гость
Всем спасибо.
...
Рейтинг: 0 / 0
MERGE запрос
    #40076735
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кесарь
P.S. Никогда не используйте заглавные буквы в командах и операторах. Это просто ужасно и моветон.
Это что за новости? Всю жизнь писал ключевые слова SQL заглавными буквами.
Никогда не говори "Никогда"!
...
Рейтинг: 0 / 0
MERGE запрос
    #40076737
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap
Кесарь
P.S. Никогда не используйте заглавные буквы в командах и операторах. Это просто ужасно и моветон.
Это что за новости? Всю жизнь писал ключевые слова SQL заглавными буквами.
Никогда не говори "Никогда"!


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

даешь холивар на применение синтаксиса!
...
Рейтинг: 0 / 0
MERGE запрос
    #40076744
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap
Кесарь
P.S. Никогда не используйте заглавные буквы в командах и операторах. Это просто ужасно и моветон.
Это что за новости? Всю жизнь писал ключевые слова SQL заглавными буквами.
Никогда не говори "Никогда"!


Мда, а мужики-то не знают...
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / MERGE запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]