2014-03-03 100 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); 
相關問題