SQL MERGE语句删除异常

时间:2016-04-19 11:44:44

标签: sql sql-server

MERGE声明的作用除了最后一节“当没有来源匹配”时 以下是声明:

MERGE INTO [SQDKRTV96].[MERGETEST].[dbo].[users] T
USING [MERGETEST].[dbo].[PS_VIEW] S
ON S.[NAME_AC] = T.[Initialer] 
WHEN MATCHED AND ( 
        T.[Løn nummer] <>   S.[EMPLID] OR
        T.[Fornavn] <>  S.[FIRST_NAME] OR
        T.[Efternavn] <>    S.[LAST_NAME]
        )
THEN UPDATE SET
    T.[Løn nummer] =  S.[EMPLID],
    T.[Fornavn] =    S.[FIRST_NAME],
    T.[Efternavn] =  S.[LAST_NAME]
WHEN NOT MATCHED BY TARGET 
THEN INSERT (
    [Løn Nummer],
    [Initialer],
    [Fornavn],
    [Efternavn]
     ) VALUES (
    S.[EMPLID],
    S.[NAME_AC],
    S.[FIRST_NAME],
    S.[LAST_NAME]
    ) 
WHEN NOT MATCHED BY SOURCE AND (T.[Fornavn] NOT LIKE 'key%' OR T.[Fornavn] NOT LIKE 'guest%' OR T.[Fornavn] NOT LIKE 'udlån%' OR T.[Fornavn] NOT LIKE 'vikar%' OR T.[Fornavn] NOT LIKE 'test%')
THEN DELETE;

我希望MERGE语句不要删除为它们定义的NOT LIKE关键字的记录。 但是这个MERGE语句一直在删除它们,为什么? 我怎么能实现他们留下来? 提前谢谢。

1 个答案:

答案 0 :(得分:3)

谓词T.[Fornavn] NOT LIKE 'key%' OR T.[Fornavn] NOT LIKE 'guest%' OR T.[Fornavn] NOT LIKE 'udlån%' OR T.[Fornavn] NOT LIKE 'vikar%' OR T.[Fornavn] NOT LIKE 'test%'不会过滤任何行,因为OR的每一面都是互斥的。例如,以&#34;键&#34;开头的任何[Fornavn]不会以&#34; guest&#34;开头。因此,即使是以&#34;键&#34;开头的[Fornavn]的行也是如此。尽管你NOT LIKE,我们会被带回来。大概你想在这个例子中使用AND而不是OR