it-source

Oracle insert(존재하지 않는 경우) 문

criticalcode 2023. 2. 16. 21:48
반응형

Oracle insert(존재하지 않는 경우) 문

insert into OPT (email, campaign_id) values('mom@cox.net',100)
where not exists( select * from OPT where (email ="mom@cox.net" and campaign_id =100)) ;

오류 보고서: SQL 오류: ORA-00933:SQL 명령이 00933을 제대로 종료하지 않았습니다.00000 - "SQL 명령이 제대로 종료되지 않았습니다" *원인:
*액션:

Oracle에 없는 경우 새 행을 삽입하려면 어떻게 해야 합니까?

insert into OPT (email, campaign_id) 
select 'mom@cox.net',100
from dual
where not exists(select * 
                 from OPT 
                 where (email ='mom@cox.net' and campaign_id =100));

이미 존재하는 다른 레코드를 기반으로 Oracle에 무언가를 삽입하는 올바른 방법은 MERGE 을 사용하는 것입니다.

이 질문은 이미 SO에 대한 답변이 있습니다.

MERGE INTO OPT
USING
    (SELECT 1 "one" FROM dual) 
ON
    (OPT.email= 'mom@cox.net' and OPT.campaign_id= 100) 
WHEN NOT matched THEN
INSERT (email, campaign_id)
VALUES ('mom@cox.net',100) 
;
insert into OPT       (email,        campaign_id) 
select 'mom@coxnet' as email, 100 as campaign_id from dual MINUS
select                 email,        campaign_id from OPT;

이미 이력이 있는 경우mom@cox.net/100OPT에서는MINUS에서 이 레코드를 뺍니다.select 'mom@coxnet' as email, 100 as campaign_id from dual아무것도 삽입되지 않습니다.한편, 그러한 기록이 없는 경우,MINUS어떤 것도, 그리고 가치관을 굴복시키지 않는다.mom@coxnet/100삽입됩니다.

p.marino가 이미 지적했듯이merge님은 작업 해결을 위해 특별히 설계되어 있기 때문에 문제에 대한 보다 나은(더 정확한) 솔루션이 될 수 있습니다.

또 다른 접근법은 다음과 같은 기능을 활용하는 것입니다.INSERT ALLoracle의 구문,

INSERT ALL 
    INTO table1(email, campaign_id) VALUES (email, campaign_id)
WITH source_data AS
 (SELECT 'mom@cox.net' email,100 campaign_id
  FROM   dual
  UNION ALL
  SELECT 'dad@cox.com' email,200 campaign_id
  FROM   dual)      
SELECT email
      ,campaign_id
FROM   source_data src
WHERE  NOT EXISTS (SELECT 1
        FROM   table1 dest
        WHERE  src.email = dest.email
        AND    src.campaign_id = dest.campaign_id);

INSERT ALL 또한 소스로서 하위 쿼리를 기반으로 여러 테이블에 조건부 삽입을 수행할 수 있습니다.

참고할 만한 아주 깨끗하고 좋은 예가 몇 가지 있습니다.

  1. oracletutorial.com
  2. oracle-base.com/

언급URL : https://stackoverflow.com/questions/10824764/oracle-insert-if-not-exists-statement

반응형