разделе update обновлять все строчки?
В данный момент есть ключ, к примеру имя. Но имя расшивается в таблице на 3 строчки, так нужно.
Когда делаю MERGE, указываю ключ только имя и пытаюсь update, но выходит ошибка, не понимает какую строчку обновлять
Ключ обычно соответствует одной "строчке"
Но в моем примере, их несколько, могу более подробно рассказать какую задачу пытаюсь решить
Значит это не ключ Напишите ddl, образец данных и что пытаетесь получить
--создание таблиц CREATE TABLE [ruslanrarr].[dbo].[zp_testt] ( rec_date nvarchar(50), end_date nvarchar(50), name VARCHAR(255) NOT NULL, vid_nadbavki nvarchar(255) null, summa float ) INSERT INTO [ruslanrarr].[dbo].[zp_testt](rec_date,end_date,name,vid_nadbavki,summa) VALUES('01.01.2023','05.05.2023','руслан','оклад',000), ('01.01.2023','05.05.2023','руслан','проф мастерство',000), ('01.01.2023','05.05.2023','руслан','питание',000) CREATE TABLE [ruslanrarr].[dbo].[zp_fact]( rec_date nvarchar(50), end_date nvarchar(50), name VARCHAR(255) NOT NULL, vid_nadbavki nvarchar(255) null, summa float ) INSERT INTO [ruslanrarr].[dbo].[zp_fact](rec_date, end_date,name,vid_nadbavki,summa) VALUES('06.05.2023','12.12.2023','руслан','оклад',500), ('06.05.2023','12.12.2023','руслан','проф мастерство',400), ('06.05.2023','12.12.2023','руслан','питание',300) ---MERGE MERGE [ruslanrarr].[dbo].[zp_fact] t USING [Ruslanrarr].[dbo].[zp_testt] s ON s.name = t.name WHEN MATCHED THEN UPDATE SET t.name = 'ЗАКРЫТО' WHEN NOT MATCHED BY TARGET THEN INSERT (rec_date,end_date,name,vid_nadbavki,summa) VALUES (s.rec_date,s.end_date,s.name,s.vid_nadbavki,s.summa);
И чего ты хочешь добиться?
Хочу, что бы все строчки в таблице факт , по ключу «имя» обновились, но выходит ошибка, так как ключ не уникальный
А Update чего не используешь?
Для merge вы должны указать в "On" критерий, по которому однозначно бужет интерпритироваться только одна строка
А можно ли как то группу строк?
Если вы хотите использовать merge, то нельзя. Делайте delete insert
А есть какой-то другой способ?
Смысл в том, что есть таблица где данные о сотрудниках на каждый день, к примеру: ФИО, дата, пол, возраст, отдел, должность, и другие поля. И данные каждый день, они могут повторятся. Но данные на каждый день по сотруднику уникальны. Ключ конечно там составной из ФИО, табельного, и других гуидов. Есть таблица с зарплатой сотрудников. Где данные к примеру, ФИО, дата начала, дата окончания, вид надбавки, сумма надбавки. И здесь как правильно по одному человеку 4 строчки может быть, разные надбавки, и дата начала и дата окончания надбавки может тоже одинаково. Я хочу ID из таблицы зарплаты , добавить в таблицу сотрудников, которые на каждый день, что бы в дальнейшем связывать по ID, но когда добавлю, таблица первая разошьетсч на большое количество строк, из за того что в таблице зарплата много строк. Вот и подумал, что через merge буду грузить и добавлять новые столбцы дата начала и дата окончания для целой группы, и id проставлю для каждый группы и тогда повторов не будет
Сделайте группировку, чтобы гарантировать уникальность по ключу в "on" merge tbl_target as t using ( select s.staff_id,max(s.attr_value) as attr_value from tbl_source s group by s.staff_id ) as s on s.staff_id=t.staff_id ...
Группировку что бы осталась одна строчка?
А группировать прямо в ON где условие?
Обсуждают сегодня