合并不插入新值

问题描述

我正在尝试使用 MERGE 将新值插入到表中,前提是它们不存在于同一个表中。

这是我正在使用的查询

MERGE [dbo].[TARGET_TABLE] AS Target 
USING 
(SELECT [NAME]
    FROM [dbo].[TARGET_TABLE] 
    WHERE [NAME]='ThisValuesDoesntExists' AND [STATUS] IS NULL) AS Source
    ON Target.[NAME]= Source.[NAME]
WHEN NOT MATCHED
    THEN INSERT ([NAME],[file_first_upload],[upload_date])
        VALUES('ThisValuesDoesntExists',1,DEFAULT);

但是当我执行它时,我收到一条(0 行受影响)消息。

如果我执行“源”查询,我得到 0 行。

SELECT [NAME] 
FROM [dbo].[TARGET_TABLE] 
WHERE [NAME] = 'ThisValuesDoesntExists' AND [STATUS] IS NULL

我做错了什么?

谢谢

解决方法

如果您查看 MERGE 文档,您将看到源数据必须存在才能与目标表中的现有行匹配(或不匹配):

当不匹配 [按目标] 那么

指定每行插入一行到 target_table 返回的 没有 匹配 target_table 中的一行,但满足额外的搜索 条件,如果存在。要插入的值由 子句。 MERGE 语句只能有一个 WHEN 不匹配 [ BY TARGET ] 子句。

您面临的问题是您的“源”数据没有返回任何内容,因此 MERGE 查询无法匹配或插入任何内容。

以下示例代码用于演示:

IF OBJECT_ID('dbo.TARGET_TABLE','U') IS NOT NULL DROP TABLE dbo.TARGET_TABLE 
GO 

CREATE TABLE TARGET_TABLE ([Name] VARCHAR(100),file_first_upload BIT,upload_date DATETIME,[STATUS] VARCHAR(100)) 

MERGE [dbo].[TARGET_TABLE] AS Target 
USING 
(SELECT [NAME]
    FROM [dbo].[TARGET_TABLE] 
    WHERE [NAME]='ThisValuesDoesntExists' AND [STATUS] IS NULL) AS Source
    ON Target.[NAME]= Source.[NAME]
WHEN NOT MATCHED
    THEN INSERT ([NAME],[file_first_upload],[upload_date])
        VALUES('ThisValuesDoesntExists',1,DEFAULT);

SELECT * 
FROM TARGET_TABLE 

MERGE [dbo].[TARGET_TABLE] AS Target 
USING (VALUES ('ThisValuesDoesntExistss',GETDATE())) AS Source ([Name],[upload_date])
ON Target.[NAME] = Source.[Name] 
WHEN NOT MATCHED
    THEN INSERT ([NAME],[upload_date]) VALUES (Source.[Name],Source.file_First_upload,Source.upload_date);

SELECT * 
FROM TARGET_TABLE