如何使用Merge删除基于Where子句条件的现有数据

时间:2014-02-18 07:27:25

标签: sql sql-server tsql

我写了一个合并声明,我在根据Where子句条件删除数据时遇到了麻烦。 让我清楚地解释我的情景

  1. 例如,我已根据日期键条件将数据从源插入目标。插入实例10条记录。
  2. 例如,记录中的某些更改已通过合并声明更新。
  3. 对于基于条件的相同日期密钥,现在已经有三条记录需要插入,并且应该删除该日期密钥的休息。
  4. 如果我没有删除10条记录并为该记录添加新记录

    ,我将如何继续此操作

    我的示例代码:

     DELETE FROM #Table1
    CREATE  TABLE #Table1  
    (ID INT ,Name VARCHAR(30),DATEKEY INT)
    INSERT INTO #Table1 (ID,Name,DATEKEY)VALUES (1,'Mohan',20131231)
    INSERT INTO #Table1 (ID,Name,DATEKEY)VALUES (2,'Raj',20131231)
    INSERT INTO #Table1 (ID,Name,DATEKEY)VALUES (3,'Majjaa',20131231)
    INSERT INTO #Table1 (ID,Name,DATEKEY)VALUES (4,'Majjaa',20131231)
    
    CREATE TABLE  #Table2  
    (ID INT ,Name VARCHAR(30),DATEKEY INT)
    
    DECLARE @i_DateKey INT
    SET @i_DateKey = '20131231'
        MERGE #Table2 AS T
        USING (
            SELECT pdp.ID
                ,pdp.Name
                ,pdp.DATEKEY
            FROM  #Table1 AS pdp
    
            WHERE (
                    pdp.DateKey = @i_DateKey
                    OR @i_DateKey IS NULL
                    )
            ) AS S
            ON T.ID = S.ID
                AND T.DateKey = S.DateKey
                AND T.NAME = S.NAME
        WHEN MATCHED
            THEN
                UPDATE
                SET T.NAME = S.NAME
        WHEN NOT MATCHED BY TARGET
            THEN
                INSERT
                VALUES (
                    S.ID
                    ,S.Name
                    ,S.DateKey
                    )
    
        WHEN NOT MATCHED BY SOURCE
         THEN
          DELETE ;
    

    现在,如果我发送另一行为Same Date键,目标表将加载Rows,那么需要删除所有4行并重新加载新行,如果新行相同则需要更新

1 个答案:

答案 0 :(得分:0)

我认为这是一个很大的错误,

ON T.ID = S.ID  --i am not sure about this
            AND T.DateKey = S.DateKey
            AND T.NAME = S.NAME -- remove this because this when matched then update will do what ?
    WHEN MATCHED
        THEN
            UPDATE
            SET T.NAME = S.NAME