2014-03-03 221 views
1

我想在SQL中插入记录,如果条目的组合存在,那么脚本不应该继续使用insert语句。以下是我迄今为止:如果记录不存在,则在SQL中插入记录

insert into TABLE_TESTING(R_COMPONENT_ID,OPRID) 
select 1942,'Test' 
from TABLE_TESTING 
where not exists 
    (select * 
    from TABLE_TESTING 
    where R_COMPONENT_ID='1942' 
     and oprid ='Test'); 

我有一个表名:TABLE_TESTING 它有两列:R_COMPONENT_ID和OPRID

如果记录的组合为“1942年”和“测试”已经存在于DB中,那么我的脚本不应该执行插入操作,并且如果它存在,那么它应该将该记录作为R_COMPONENT_ID和OPRID的组合来插入。

请建议。 使用上面指定的查询我得到多个插入已被添加到数据库中。请提出一些解决方案。

+0

您正在使用哪些DBMS? Postgres的?甲骨文? –

+0

@ a_horse_with_no_name我正在使用Oracle。 – user3373799

回答

0

这是一个使用MERGE的skelton。我跑它,它工作正常。您可以根据您的需求进一步调整它。希望这可以帮助!

DECLARE 
BEGIN 
    FOR CURTESTING IN (SELECT R_COMPONENT_ID, OPRID FROM TABLE_TESTING) 
    LOOP 
     MERGE INTO TABLE_TESTING 
      USING DUAL 
       ON (R_COMPONENT_ID = '1942' AND OPRID = 'Test') 
     WHEN NOT MATCHED 
     THEN 
     INSERT  (PK, R_COMPONENT_ID, OPRID) 
      VALUES (TEST_TABLE.NEXTVAL, '1942', 'Test'); 
    END LOOP; 

    COMMIT; 
END; 
+0

在循环中执行合并不是一个好主意。这可以不使用(非常缓慢)光标方法 –

+0

我同意。想法是给MERGE的skelton作为@ user3373799提到对MERGE的不知情。 –

2

试试这个

if not exists(Select * From TABLE_TESTING where R_COMPONENT_ID='1942' and OPRID='Test') 
begin 
    insert into TABLE_TESTING(R_COMPONENT_ID,OPRID) values('1942','Test') 
end 
+0

它说错误在命令开始。这里是我正在执行的查询:如果不存在(select * from TABLE_TESTING where R_COMPONENT_ID ='1942'and OPRID ='Test')开始插入TABLE_TESTING(R_COMPONENT_ID,OPRID)值('1942','Test')end; – user3373799

+0

你在哪里使用这个查询? – joker

+0

我在我的Oracle SQL Developer中执行了此操作 – user3373799

0

您可以使用MERGE操作。

+0

由于我是SQL的新手,因此没有太多的知识。 – user3373799

+0

最好是获取一些知识,而不仅仅是复制粘贴。只是一个建议。凉。 –

0
insert into TABLE_TESTING 
select 1942,'Test' where 0<(
select count(1) from TABLE_TESTING 
where not exists(select 1 from TABLE_TESTING where R_COMPONENT_ID=1942 and oprid ='Test')) 

试试上面的代码。

+0

获取以下错误代码:SQL错误:未找到ORA-00923:FROM关键字 00923。00000 - “在预期的位置找不到FROM关键字” – user3373799

3

由于您不想更新现有的行,您的方法基本上是正确的。你所要做的唯一变化,就是更换from table_testing在insert语句的来源:

insert into TABLE_TESTING (R_COMPONENT_ID,OPRID) 
select 1942,'Test' 
from dual -- <<< this is the change 
where not exists 
    (select * 
    from TABLE_TESTING 
    where R_COMPONENT_ID = 1942 
     and oprid = 'Test'); 

当您使用from table_testing这意味着插入试图在TABLE_TESTING插入一行的每一行。但你只想插入一个单行行。从DUAL中选择就可以实现。

正如其他人指出的,您也可以使用MERGE语句,如果您需要插入的不仅仅是单个行,这可能会更好一些。

merge into table_testing target 
using 
(
    select 1942 as R_COMPONENT_ID, 'Test' as OPRID from dual 
    union all 
    select 1943, 'Test2' from dual 
) src 
ON (src.r_component_id = target.r_component_id and src.oprid = target.oprid) 
when not matched 
then insert (r_component_id, oprid) 
    values (src.r_component_id, src.oprid); 
相关问题