如果值已存在,请插入Oracle SQL或Update?

时间:2016-07-08 08:07:13

标签: c# sql oracle

我想要的是:If key exist in Oracle SQL Table → UPDATE, otherwise do a INSERT

昨天玩了一整天后,我设法得到INSERT部分(下面的查询),我现在需要的是UPDATE部分。

这就是我需要它的原因:我有一个RadGridView(使用Telerik和WPF)。当用户单击“插入”按钮时,将添加一个新行,在用户点击“输入”后,该值将插入到数据库中。但是用户也可以单击RadGridView中的可用行并更新值,因此我也需要更新数据库中的值(而不是执行INSERT)。这就是为什么我想要一个可以执行Udate或Insert的查询。

任何帮助都表示赞赏,如果您有更好的方法来实现INSERT部分,我想了解它:)

我正在使用Oracle SQL Developer(Windows 10)。

ps。我尝试了一些我在StackOverflow上找到的解决方案,但无法将解决方案应用于我的问题。

表1

+-----------------------------------+------------+--------+
|               ID                  |  ORIGTERM  |  CODE  |
+-----------------------------------+------------+--------+
| 126478                            | Grass      |  TEST  |
| 374628                            | Flower     |  TEST  |
| 128754                            | Tree       |  TEST  |
+-----------------------------------+------------+--------+

表2

+-----------------------------------+------------+---------+
|               ID                  |REPLACETERM |SYSCTLANG|
+-----------------------------------+------------+---------+
| 126478                            | Gras       |     3   |
| 374628                            | Blume      |     3   |
| 128754                            | Baum       |     3   |
+-----------------------------------+------------+---------+


我设法获得 INSERT 查询,它看起来像这样(例如插入'Plant'一词):

INSERT ALL 
   INTO Table1(origterm,code) VALUES (s_origterm,s_code) 
   INTO Table2(replaceterm) VALUES (s_replaceterm) 
  SELECT s_origterm, s_code, s_replaceterm 
    FROM (SELECT 'Plant' s_origterm, 'TEST' s_code, 'Pflanze' s_replaceterm FROM dual) 
    dual;

我还必须更新Table2的ID ,使其与Table1中的ID相同:

UPDATE Table2 SET Table2.ID = (SELECT Table1.ID FROM Table1 WHERE origterm='Plant') 
              WHERE replaceterm='Pflanze';

现在我有一个看起来像这样的表:

    +-----------------------------------+------------+--------------+------+
    |               ID                  |  ORIGTERM  |  REPLACETERM | CODE |
    +-----------------------------------+------------+--------------+------+
    | 126478                            | Grass      |  Gras        | TEST |
    | 374628                            | Flower     |  Blume       | TEST |
    | 128754                            | Tree       |  Baum        | TEST |
    | 100000                            | Plant      |  Pflanze     | TEST |
    +-----------------------------------+------------+--------------+------+
  

SELECT g.ID, origterm, replaceterm, code FROM Table1 g, Table2 ct WHERE g.ID = ct.ID;

3 个答案:

答案 0 :(得分:2)

合并不适用于INSERT ALL。如果要使用合并,则应从两个表view with instead of trigger创建,而不是对视图使用合并。整个逻辑将在触发器内。

编辑:合并不适用于此类视图 ORA-38106:MERGE bei加入查看oder查看mit INSTEAD OF-Triggernichtunterstützt

你可以制作两个合并语句(每个表一个)或一个用于插入,一个用于视图更新:

- (id)item
{    
    if ([self.activityType isEqualToString:UIActivityTypePostToFacebook]) {
        // Upload to Giphy
        ...
        return [NSURL URLWithString:giphyURL];
    }
}

而不是触发器中的逻辑可以做得更好,但我把它留给你;)

答案 1 :(得分:1)

也许这太明显但是如果你拥有'key'值可能这个程序会起作用:

DECLARE _flag AS INT = 0;

SELECT COUNT() INTO _flag FROM table1 WHERE ID = key;

IF _flag = 0 THEN
   INSERT ...
ELSE
   UPDATE ....
END IF;

根据您自己的代码需求和/或ORACLE SQL方言进行调整。

答案 2 :(得分:1)

可能的解决方案是使用MERGE关键字,在此处记录:

http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9016.htm

合并基本上是一个“上传”。命令,意味着如果存在或插入它将更新行,如果它没有。