SQL合并是否可以很好地替代单表select-check-update语句?

时间:2019-11-27 08:05:34

标签: sql firebird sql-merge

我有表adv_days(adv_date date not null primary key, edit_state integer),我想执行一系列命令:检查表中是否存在'27 .11.2019',如果存在,则将edit_state更新为1,如果不存在,则插入日期'27 .11。 2019”,edit_state = 1。

我想出了Firebrid合并语句:

merge into adv_days d
  using (select adv_date, edit_state from adv_days where adv_date='27.11.2019') d2
  on (d.adv_date=d2.adv_date)
when matched then update set d.edit_state=1
when not matched then
  insert(adv_date, edit_state)
  values(:adv_date, 1); 

它可以按预期进行编译和工作,但是我为合并而阅读的所有示例都是关于将其应用于2个表的。那么-也许有一个更好的解决方案来对一张表进行选择检查更新操作,而不是合并?

这是设计问题,但由于如此具体,因此SO比软件工程更合适。

1 个答案:

答案 0 :(得分:1)

有一个社区回应,merge用于一个表的插入/更新是完全有效的解决方案。但是,当然update or insert是更优雅的解决方案,例如在这种情况下,代码为:

update or insert into adv_days (adv_date, edit_state)
  values ('27.11.2019', 1)
  matching (adv_date)

该解决方案在合并(如问题中提到的)方面提高了性能,因为从两个计划中重复执行两个语句时,可以从计划中观察到索引读取的数量。

在两种情况下仍然存在缺点:重复执行会导致更新,尽管不必触摸已经具有所有必需值的记录。