[英]How To Update Multiple Conditions Using MERGE Statements
我必须比较源数据和目标数据并相应地合并它们。 但是我有多个条件。 以下是我的第一组源数据
Source-Table1
ID StartDate EndDate Designation
1 2018-01-01 2199-12-31 Associate Engineer
2 2018-02-01 2199-12-31 Software Engineer
Target-Table2
ID StartDate EndDate Designation
1 2018-01-01 2199-12-31 Associate Engineer
2 2018-02-01 2199-12-31 Software Engineer
Create table Table1(
Id int,
StartDate datetime,
EndDate Datetime,
Designation nvarchar(100)
)
Create table Table2(
Id int,
StartDate datetime,
EndDate Datetime,
Designation nvarchar(100)
)
--insert values
insert into Table1 values(1,'2018-01-01','2199-12-31','Associate Engineer')
insert into Table1 values(2,'2018-02-01','2199-12-31','Software Engineer')
--Use Merge to Update/Insert values
MERGE Table2 t
USING Table1 s
on t.id=s.id
WHEN MATCHED THEN
update SET
t.id=s.id,
t.StartDate=s.StartDate,
t.EndDate=s.EndDate,
t.Designation=s.Designation
WHEN NOT MATCHED BY TARGET THEN
INSERT(
ID,
StartDate,
ENDDate,
Designation
)
VALUES
(s.ID,
s.StartDate,
s.EndDate,
s.Designation)
;
现在,如果我必须更新多个条件,此代码将不起作用。 例如,如果“我的源数据”具有以下值,则每个ID不能具有重叠值。 当每个ID都有新记录时,我必须检查StartDate,如果start Date是<enddate那么,将我的旧endDate更新到上个月的最后一天,并插入新记录,否则ID和StartDate匹配,然后更新所有记录。 如果ID和StartDate不匹配,则插入。
Source-Table1
ID StartDate EndDate Designation
1 2018-01-01 2199-12-31 Associate Engineer
1 2018-02-01 2199-12-31 Software Engineer
2 2018-02-01 2199-12-31 Software Engineer
2 2018-03-01 2199-12-31 Senior Software Engineer
现在我要我的目标表
ID StartDate EndDate Designation
1 2018-01-01 2018-01-31 Associate Engineer
1 2018-02-01 2199-12-31 Software Engineer
2 2018-02-01 2018-02-28 Software Engineer
2 2018-03-01 2199-12-31 Senior Software Engineer
我无法使用MERGE语句执行此操作。你们中的任何人都可以帮助我获得此结果吗?
如果我正确理解了您的问题,那么您希望将源表与目标表合并。 但是,如果用户的角色已更改,例如将助理工程师更改为软件工程师,则您希望将原始记录的EndDate更新为新记录开始日期之前的该月的最后一天。 如果我的理解是正确的,那么您应该能够实现以下目标:
;MERGE [Table2] [T]
USING (
SELECT [T1].[Id]
,[T1].[StartDate]
,CAST(LEAD(EOMONTH(DATEADD(DAY, -1, [T1].[StartDate])), 1, [T1].[EndDate]) OVER (PARTITION BY [T1].[Id] ORDER BY [T1].[StartDate]) AS DATETIME) AS [EndDate]
,[T1].[Designation]
FROM [dbo].[Table1] [T1]
) [S]
ON ([T].[Id] = [S].[Id] AND [T].[StartDate] = [S].[StartDate])
WHEN MATCHED THEN
UPDATE
SET [T].[EndDate] = [S].[EndDate],
[T].[Designation] = [S].[Designation]
WHEN NOT MATCHED BY TARGET THEN
INSERT
(
[Id],
[StartDate],
[EndDate],
[Designation]
)
VALUES
(
[S].ID,
[S].StartDate,
[S].EndDate,
[S].Designation
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.