簡體   English   中英

如何使用MERGE語句更新多個條件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM