【问题标题】:Merge not inserting new values合并不插入新值
【发布时间】:2021-03-01 19:43:03
【问题描述】:

我正在尝试使用 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

我做错了什么?

谢谢

【问题讨论】:

  • 您从TARGET_TABLE TARGET_TABLE合并似乎很奇怪。
  • 您正在向后考虑...当您的源表中没有行时,没有匹配或不匹配。要获得不匹配,您需要源中的一行在您的目标中不存在 - 您已尝试以相反的方式进行操作。如果您将源设为静态values,则它可以工作。
  • Reasons why not to use MERGE(不确定其中有多少仍然是当前的错误)以及a good reason to yes use MERGE in this type of query 顺便说一句,我建议UPDLOCK, HOLDLOCK 提示目标

标签: sql sql-server tsql sql-server-2017 sql-merge


【解决方案1】:

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

当不匹配[按目标]然后

指定每行插入一行到 target_table 返回的 ON 没有 匹配 target_table 中的一行,但满足额外的搜索 条件(如果存在)。要插入的值由 子句。 MERGE 语句只能有一个 WHEN NOT MATCHED [ 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',1,GETDATE())) AS Source ([Name], [file_first_upload],[upload_date])
ON Target.[NAME] = Source.[Name] 
WHEN NOT MATCHED
    THEN INSERT ([NAME],[file_first_upload],[upload_date]) VALUES (Source.[Name], Source.file_First_upload, Source.upload_date);

SELECT * 
FROM TARGET_TABLE 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 2011-07-03
    • 2020-03-22
    相关资源
    最近更新 更多