【问题标题】:How to use MERGE's 'When not matched' to insert a new record in same table?如何使用 MERGE 的“不匹配时”在同一张表中插入新记录?
【发布时间】:2015-10-03 00:41:20
【问题描述】:

我正在尝试使用 SQL Server 的 Merge 语句对单个表执行 upsert。

declare @Mergeoutput table (action varchar(50))

declare variables ...

MERGE Usertable AS target
using (Select .... from Usertable where filter conditions using variables)
    as Source (column names..)
on source.... = target.... (multiple statements)

WHEN MATCHED THEN
  UPDATE SET....

WHEN NOT MATCHED by target THEN
  INSERT (...)
     VALUES (...)
output $action into @Mergeoutput;
select * from @Mergeoutput

如果有匹配则更新有效,但没有匹配时插入不会发生。 @Mergeout 是空的。我的更新和插入语句应该对一行执行操作。当 using 语句为空集并且我想插入新行时,Merge 是如何工作的?

更新:
这是运行一切的 SQL。我希望@Mergeoutput 返回“插入”并且 Person 表有一个新行。

Create table Person
(
  name varchar(20)
)

declare @Mergeoutput table (action varchar(50))

declare @newName varchar(20)

select @newName  = 'John'

MERGE Person AS target
using (Select name from Person where name= 'John')
    as Source (name)
on source.name = target.name

WHEN MATCHED THEN
  UPDATE SET name = 'John2'

WHEN NOT MATCHED THEN
  INSERT (name)
     VALUES ('John')
output $action into @Mergeoutput;
select * from @Mergeoutput

select * from person

【问题讨论】:

  • 请为sqlfiddle.com 准备样本表和所需的输出。有点不清楚你想要实现什么。看起来像here
  • sqlfiddle 不断给我合并语句的错误。请参阅上面的更新。
  • 看起来没人知道我确实提到源是一个空集,因此不会插入合并

标签: sql-server sql-server-2012


【解决方案1】:

通常,您的MERGE 语句如下所示:

MERGE INTO @Person AS target
USING
(
    SELECT name 
    FROM @Person 
    WHERE <.......>
) AS Source
ON source.name = target.name

WHEN MATCHED THEN
UPDATE SET name = Source.name

WHEN NOT MATCHED THEN
INSERT (name)
VALUES (Source.name)
;

请注意,我从Source 获取值并将它们插入Target

当不匹配时[按目标]然后

指定每行插入一行到target_table 由&lt;table_source&gt; ON &lt;merge_search_condition&gt; 返回 匹配 target_table 中的一行,但满足额外的搜索 条件(如果存在)。要插入的值由 &lt;merge_not_matched&gt; 子句。

因此,如果您的Source 为空,则无论ON 条件如何,都不会插入任何内容。

目前尚不清楚您要实现的总体逻辑是什么,但似乎您可能需要在 Source 查询中添加一些额外的逻辑。

【讨论】:

  • 我想我没有完全理解 Merge 语句。使用(SELECT @NewName)作为源工作。这个想法是源不能为空以使插入工作。我可能只使用老式的 if.. insert else update。
  • MERGE 当您有两个不同的表并且需要同步它们时效果很好。在同一张桌子上使用MERGE 对我来说听起来很奇怪。在您的情况下,如您所说,使用显式 IF 可能更容易更好。这取决于IF 中的逻辑以及您是要更新和插入单行还是多行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多