当不存在如下记录时,我可以使用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语句来完成此操作。
答案 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')