【问题标题】:Merge statement for first time insert第一次插入的合并语句
【发布时间】:2017-05-24 08:52:00
【问题描述】:

我做了一些研究,但找不到任何解决方案,因此在此处发布。

我们有一个每天运行的数据加载作业。我们有单独的 DML 语句来插入、更新等。我们希望避免插入语句运行多次。

在这种情况下是否可以选择使用合并语句来更新记录是否存在或插入如果不存在?

如果可能的话,请给我一个例子,因为我对 sql 语句很陌生。

我们正在为 dbms 使用 Oracle db2

提前致谢!

【问题讨论】:

  • 您使用的是哪个 dbms?
  • "我们正在使用 Oracle db2" - Oracle 来自 Oracle,而 DB2 来自 IBM。那么您使用的是哪个 DBMS
  • 我的意思是 IBM DB2。顺便说一句,即使你没有给出答案,也是好巨魔#theyareeverywhere

标签: sql sql-merge


【解决方案1】:

使用 IF EXISTS 语句,如下所示:

IF EXISTS (SELECT 1 FROM #mytable# WHERE #column1# = #this# AND #column2# = #that)
BEGIN
   #update statement#
END

ELSE
BEGIN
    #insert statement#
END

编辑: 可以在这里找到语法:https://www.toadworld.com/platforms/ibmdb2/w/wiki/7777.ifthenelse

这意味着我的一般情况在 DB2 中会变成这样:

IF (#count of value# = 1) THEN
   #updatestatement#;
ELSEIF (#count of value# > 1) THEN
   #throw an error, as you cannot update uniquely#
ELSE
   #insertstatement#;
END IF;

我还注意到您可以在 DB2 上运行 SQL 命令,这可能对这项任务也很有用

最后,看看这里,可能会给你更多的想法:)

DB2 for IBM iSeries: IF EXISTS statement syntax

【讨论】:

  • 你能给我一个例子吗?找不到一个 db2 :(
【解决方案2】:

通过 Merge 语句本身完成它:)

MERGE INTO table1(storeent_id, name, value) AS t1
  USING (VALUES ((SELECT STOREENT_ID FROM STOREENT WHERE IDENTIFIER='test'), 'SOLR_SERVICEABILITY_URL', 
                                                'Sample')) AS t2(storeent_id, name, value)
  ON t1.name = t2.name AND t1.storeent_id = t2.storeent_id
  WHEN MATCHED THEN
     UPDATE SET
        t1.value = t2.value
  WHEN NOT MATCHED THEN
     INSERT
        (name, storeent_id, value)
        VALUES (t2.name, t2.storeent_id, t2.value);

【讨论】:

    猜你喜欢
    • 2017-03-27
    • 2013-01-16
    • 2020-04-05
    • 2016-01-03
    • 2019-07-30
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多