我想要的是: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;
答案 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
合并基本上是一个“上传”。命令,意味着如果存在或插入它将更新行,如果它没有。