合并不适用于不存在的插入记录

时间:2019-12-13 04:38:42

标签: sql sql-server

当不存在如下记录时,我可以使用Merge插入记录吗

MERGE INTO [dbo].[Test] AS [Target]
USING (SELECT DISTINCT [Name] FROM [dbo].[Test]) AS [Source]
    ON [Target].[Name] = [Source].[Name]
WHEN NOT MATCHED THEN
INSERT ([Id], [Name])
VALUES (NEWID(), 'Hello');

如果值Hello的记录在表Test中不存在,则将其插入,否则不做任何事情。上面的代码记录没有插入,即使我在表中没有该记录。而且没有错误。

我知道如何使用insert ... where not exists (...)完成此操作,但是我特别想知道如何使用merge语句来完成此操作。

2 个答案:

答案 0 :(得分:2)

您的merge语句不起作用的原因是,您正在将同一张表dbo.Test合并回自身,因此当然不会丢失任何记录。

您可以按如下所示插入一条丢失的记录,在其中创建一个 source 查询以包含要插入的记录:

declare @Test table (id uniqueidentifier, [Name] nvarchar(64))

select * from @Test

-- Returns
-- id                                   |   Name
-- ----------------------------------------------

MERGE INTO @Test AS [Target]
USING (select 'Hello' [Name]) AS [Source]
ON [Target].[Name] = [Source].[Name]
WHEN NOT MATCHED THEN
INSERT ([Id], [Name])
VALUES (NEWID(), [Name]);

select * from @Test

-- Returns
-- id                                   |   Name
-- ----------------------------------------------
-- C1C87CD5-F745-436D-BD8D-55B2AF431BED |   Hello

答案 1 :(得分:0)

我同意Dale K的回答。它是正确的。

如果我想您可能有一个source_table,那么从那里需要插入数据,而如果记录已经存在就不需要从那里插入数据,那么您可以执行以下操作。

您可以代替MERGE

insert
  into dbo.Test
       (id
        ,name
        ) 
  select top 1 
         newID()
        ,'Hello'
   from dbo.Test a
  where not exists(select 1 
                     from dbo.Test b 
                    where b.name='Hello')