C# 如果值已存在,是否插入Oracle SQL或更新?
我想要的是:C# 如果值已存在,是否插入Oracle SQL或更新?,c#,sql,oracle,C#,Sql,Oracle,我想要的是:If键存在于Oracle SQL表中→ 更新,否则进行插入 昨天玩了一整天之后,我设法得到了插入部分(下面的查询),现在我需要的是更新部分 这就是我需要它的原因:我有一个RadGridView(使用Telerik和WPF)。当用户单击“插入”按钮时,将添加一个新行,在用户单击“回车”后,该值将插入到数据库中。但用户也可以单击RadGridView中的可用行并更新值,因此我也需要更新数据库中的值(而不是执行插入)。这就是为什么我需要一个可以执行Udate或Insert的查询 非常感谢您
If键存在于Oracle SQL表中→ 更新,否则进行插入
昨天玩了一整天之后,我设法得到了插入部分(下面的查询),现在我需要的是更新部分
这就是我需要它的原因:我有一个RadGridView(使用Telerik和WPF)。当用户单击“插入”按钮时,将添加一个新行,在用户单击“回车”后,该值将插入到数据库中。但用户也可以单击RadGridView中的可用行并更新值,因此我也需要更新数据库中的值(而不是执行插入)。这就是为什么我需要一个可以执行Udate或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 |
+-----------------------------------+------------+---------+
我设法得到了插入查询,它看起来像这样(例如插入单词'Plant'): 我还必须更新表2的ID,使其与表1中的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 |
+-----------------------------------+------------+--------------+------+
从表1 g、表2 ct中选择g.ID、origterm、replaceterm、代码,其中g.ID=ct.ID代码>
可能这太明显了,但如果您拥有“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方言进行调整。这可能太明显了,但如果您拥有“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方言进行调整。一种可能的解决方案是使用合并关键字,如下所述:
Merge基本上是一个“upsert”命令,这意味着它将更新行(如果存在),或插入行(如果不存在)。一个可能的解决方案是使用Merge关键字,如下所述:
Merge基本上是一个“upsert”命令,这意味着它将更新行(如果存在),或插入行(如果不存在)。Merge不适用于全部插入。如果要使用merge,则应该从表a和表a中进行合并,然后对视图使用merge。整个逻辑将在触发器内
编辑:合并不适用于此类视图
ORA-38106:将bei连接视图合并为mit视图,而不是触发器nicht unterstützt
您可以创建两个合并语句(每个表一个),或者一个用于insert,另一个用于update反对视图:
CREATE SEQUENCE MYDICT_SEQ START WITH 1 MAXVALUE 9999999999999999999999999999 MINVALUE 0;
CREATE VIEW mydict
AS
SELECT a.id, a.origterm, a.code, b.replaceterm, b.sysctlang
FROM table1 a LEFT OUTER JOIN table2 b ON a.id = b.id;
CREATE OR REPLACE TRIGGER mydict_io
INSTEAD OF INSERT OR UPDATE OR DELETE
ON mydict
FOR EACH ROW
DECLARE
cnt1 INTEGER := 0;
cnt2 INTEGER;
nid NUMBER;
BEGIN
IF INSERTING OR UPDATING THEN
IF :new.id IS NULL AND INSERTING THEN
nid := mydict_seq.NEXTVAL;
ELSE
nid := :new.id;
IF UPDATING THEN
nid := :old.id;
END IF;
SELECT COUNT (*)
INTO cnt1
FROM table1
WHERE id = nid;
END IF;
IF cnt1 = 0 THEN
INSERT INTO TABLE1 (ID, ORIGTERM, CODE)
VALUES (nID, :new.ORIGTERM, :new.CODE);
ELSIF cnt1 > 0 THEN
UPDATE TABLE1
SET ORIGTERM = :NEW.ORIGTERM, CODE = :NEW.CODE
WHERE id = nid;
END IF;
SELECT COUNT (*)
INTO cnt2
FROM table2
WHERE id = nid AND SYSCTLANG = :new.SYSCTLANG;
IF cnt2 = 0 THEN
INSERT INTO TABLE2 (ID, REPLACETERM, SYSCTLANG)
VALUES (nID, :new.REPLACETERM, :new.SYSCTLANG);
ELSE
UPDATE TABLE2
SET REPLACETERM = :new.REPLACETERM
WHERE id = nid AND SYSCTLANG = :new.SYSCTLANG;
END IF;
ELSIF DELETING THEN
DELETE FROM table2
WHERE id = :old.id AND SYSCTLANG = :old.SYSCTLANG;
SELECT COUNT (*)
INTO cnt2
FROM table2
WHERE id = nid;
IF cnt2 = 0 THEN
DELETE FROM table1
WHERE id = :old.id;
END IF;
END IF;
END;
DECLARE
nid NUMBER;
BEGIN
INSERT INTO mydict (ORIGTERM, CODE, REPLACETERM, SYSCTLANG)
VALUES ('Plant', 'TEST', 'Pflanze', 3);
nid := mydict_seq.currval;
UPDATE mydict
SET REPLACETERM = 'Fabrik'
WHERE id = nid;
UPDATE mydict
SET REPLACETERM = 'Usine', SYSCTLANG = 4
WHERE id = nid;
END;
instead of触发器中的逻辑可以做得更好,但我将此留给您;) 合并不适用于全部插入。如果要使用merge,则应该从表a和表a中进行合并,然后对视图使用merge。整个逻辑将在触发器内
编辑:合并不适用于此类视图
ORA-38106:将bei连接视图合并为mit视图,而不是触发器nicht unterstützt
您可以创建两个合并语句(每个表一个),或者一个用于insert,另一个用于update反对视图:
CREATE SEQUENCE MYDICT_SEQ START WITH 1 MAXVALUE 9999999999999999999999999999 MINVALUE 0;
CREATE VIEW mydict
AS
SELECT a.id, a.origterm, a.code, b.replaceterm, b.sysctlang
FROM table1 a LEFT OUTER JOIN table2 b ON a.id = b.id;
CREATE OR REPLACE TRIGGER mydict_io
INSTEAD OF INSERT OR UPDATE OR DELETE
ON mydict
FOR EACH ROW
DECLARE
cnt1 INTEGER := 0;
cnt2 INTEGER;
nid NUMBER;
BEGIN
IF INSERTING OR UPDATING THEN
IF :new.id IS NULL AND INSERTING THEN
nid := mydict_seq.NEXTVAL;
ELSE
nid := :new.id;
IF UPDATING THEN
nid := :old.id;
END IF;
SELECT COUNT (*)
INTO cnt1
FROM table1
WHERE id = nid;
END IF;
IF cnt1 = 0 THEN
INSERT INTO TABLE1 (ID, ORIGTERM, CODE)
VALUES (nID, :new.ORIGTERM, :new.CODE);
ELSIF cnt1 > 0 THEN
UPDATE TABLE1
SET ORIGTERM = :NEW.ORIGTERM, CODE = :NEW.CODE
WHERE id = nid;
END IF;
SELECT COUNT (*)
INTO cnt2
FROM table2
WHERE id = nid AND SYSCTLANG = :new.SYSCTLANG;
IF cnt2 = 0 THEN
INSERT INTO TABLE2 (ID, REPLACETERM, SYSCTLANG)
VALUES (nID, :new.REPLACETERM, :new.SYSCTLANG);
ELSE
UPDATE TABLE2
SET REPLACETERM = :new.REPLACETERM
WHERE id = nid AND SYSCTLANG = :new.SYSCTLANG;
END IF;
ELSIF DELETING THEN
DELETE FROM table2
WHERE id = :old.id AND SYSCTLANG = :old.SYSCTLANG;
SELECT COUNT (*)
INTO cnt2
FROM table2
WHERE id = nid;
IF cnt2 = 0 THEN
DELETE FROM table1
WHERE id = :old.id;
END IF;
END IF;
END;
DECLARE
nid NUMBER;
BEGIN
INSERT INTO mydict (ORIGTERM, CODE, REPLACETERM, SYSCTLANG)
VALUES ('Plant', 'TEST', 'Pflanze', 3);
nid := mydict_seq.currval;
UPDATE mydict
SET REPLACETERM = 'Fabrik'
WHERE id = nid;
UPDATE mydict
SET REPLACETERM = 'Usine', SYSCTLANG = 4
WHERE id = nid;
END;
instead of触发器中的逻辑可以做得更好,但我将此留给您;) 使用MERGE
语句怎么样?@psur您能告诉我怎么做吗?如何将其应用于我的问题?为什么这两个表:表1和表2被分开?ID
列是这两个表之一的主键吗?为什么要使用这样的数据模型?第三个表是什么?如何获得id
=100000的值?它是来自一个序列还是其他序列?请解释您需要更新哪个表,以及新数据来自何处,因为我迷路了。@kordirko表1包含未翻译的术语,表2包含已翻译的术语。这样的数据模型是给我的。第三个表是表1和表2的组合(查看最后隐藏的SQL查询)。ID是主键。当我在表1中插入ORIGTERM值时,ID将自动为我设置,换句话说,我不需要添加ID。我需要更新第三个表,但这是通过表1和表2完成的。如何使用MERGE
语句?@psur您能告诉我如何操作吗?如何将其应用于我的问题?为什么这两个表:表1和表2被分开?ID
列是这两个表之一的主键吗?为什么要使用这样的数据模型?第三个表是什么?如何获得id
=100000的值?它是来自一个序列还是其他序列?请解释您需要更新哪个表,以及新数据来自何处,因为我迷路了。@kordirko表1包含未翻译的术语,表2包含已翻译的术语。这样的数据模型是给我的。第三个表是表1和表2的组合(查看最后隐藏的SQL查询)。ID是主键。当我在表1中插入ORIGTERM值时,ID将自动为我设置,换句话说,我不需要添加ID。我需要更新第三个表,但这是通过表1和表2完成的。我的SQL没有那么先进,请您解释一下您的代码好吗?什么将_标志声明为INT=0;do?声明一个INT类型的变量_标志,默认值为0。。。正确的语法可能会在SQL方言之间发生变化,但我很确定它会起作用。。如果你愿意,你可以把它分成两行。。。。将_标志声明为INT;设置_标志=0;在某些SQL方言中,您可以省略“AS”,因为我对SQL不是很在行,请您解释一下您的代码好吗?什么将_标志声明为INT=0;do?声明一个INT类型的变量_标志,默认值为0。。。正确的语法可能会在SQL方言之间发生变化,但我很确定它会起作用。。如果你愿意,你可以把它一分为二