【问题标题】:MERGE vs delete and insert into select合并与删除并插入选择
【发布时间】:2020-01-31 05:14:10
【问题描述】:

我正在查看MERGE 声明,但我不明白它的意义所在。

如果我错了,请纠正我,但基本上,它使目标表成为源表的相同副本。

那么从 1 个表中删除记录并简单地 INSERT INTO ...从另一个表中选择所有行不是更容易吗?

在 MERGE 的效率方面我有什么遗漏吗?

【问题讨论】:

  • 有人投票关闭我的票,而在评论中只字未提。也许从您的专业知识的高度来看,这并不有趣,但我认为这是一个与其他任何问题一样有效的问题:我想了解使用这两种方法更新表格的区别。那有什么问题?至少说点什么让我知道我在这里做错了什么?谢谢
  • 嗨 Lana,有人投票结束您的问题(这不是票)“主要基于意见”。我们不知道是谁(接近投票是匿名的,直到问题最终结束),但我们可以猜到原因:你在问“做 X 不是更容易吗”,但“更容易”并不是一个客观的衡量标准.例如,对你来说更容易的事情对我来说可能并不容易。堆栈溢出问题的形成方式应该能够客观地回答。与其“更简单”,不如询问更短的代码、更短的查询完成运行时间、避免一些数据丢失等。希望对您有所帮助!
  • 谢谢,现在我明白了,以后会尽我所能更好地提出问题! :)

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


【解决方案1】:

Merge 语句不会使目标表成为源表的副本,你弄错了那部分。

它提供了一种更短的方式来编写条件 DML 语句 - insert / update / delete - 通过让您编写将执行上述 DML 语句中的一个(或任意组合)的单个语句。

然而,尽管Merge 是作为单个语句编写的,但在幕后 SQL Server 实际上将它作为一系列语句执行——它的每个部分都得到它是一个语句——这可能会导致很多意想不到的问题用户。
Aaron bertrand 发表了一篇题为 Use Caution with SQL Server's MERGE Statement 的文章 - 在 SQL Server 中使用 Merge 语句之前,您应该仔细阅读它。

大多数时候,Merge 用于执行“更新插入” - 意思是 - 如果存在则更新记录,如果不存在则插入。 Aaron 对this SO question 的回答中描述了一种更好、更安全的 SQL 服务器“upsert”模式,我强烈建议尽可能在Merge 上使用它。

【讨论】:

  • 好吧,如果merge不必全部插入+更新+删除,那么效率就在语法上。它显然比编写子查询和连接来查找所需的行更简洁。谢谢你的回答,我也去看看文章。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2013-01-16
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 2023-03-15
相关资源
最近更新 更多