2016-09-12 4 views
-3

나는 아래와 같이 테이블 정의와 샘플 데이터가 있습니다. 오라클 삭제 및 하나의 문장에 삽입

user_id,attr_key,attr_val,rating,status 
user_1,k1,v1,5,ACT 
user_1,k2,v2,6,ACT 
user_2,k1,v1,3,INACT 
user_2,k2,v2,2,ACT 
user_2,k3,v3,8,ACT 
root,k1,v1,9,ACT 
root,k2,v2,8,ACT 

그것은 user_2와 user_2 데이터의 상태가 다음 INACT이다가 ACT와 뿌리에 복사 할 필요가있는 경우 루트 사용자의 데이터를 덮어 쓸 수 있습니다 하나의 쿼리 문을 작성할 수 있습니까? 아래의 예상 출력을 참조하십시오.

Expected output of query: 
user_id,attr_key,attr_val,rating,status 
user_1,k1,v1,5,ACT 
user_1,k2,v2,6,ACT 
user_2,k1,v1,3,INACT 
user_2,k2,v2,2,ACT 
user_2,k3,v3,8,ACT 
root,k1,v1,3,ACT 
root,k2,v2,2,ACT 
root,k3,v3,8,ACT 

호건의 쿼리 (TODO : 같은 문에 삽입하기 전에 루트를 삭제)

INSERT INTO some_table 
    SELECT 'root', attr_key, attr_val, rating, 'ACT' 
    FROM some_table 
    WHERE user_id = 'user_1' 

감사합니다.

+2

가능합니다. 그러나 이것은 스크립트 작성 서비스가 아닙니다. 당신은 당신 자신의 학습과 노력을해야합니다. 구문에 특정 세부 사항이 붙어있는 경우 해당 질문을 게시하십시오. 누군가에게 코드를 작성하도록 요청하지 마십시오. – Aganju

+0

이것은 단지 삽입입니다. 데이터가 삭제되었습니다. – JohnHC

답변

0

필터를 사용하여 데이터를 기반으로 무언가를 삽입하려고합니다. 삽입, 선택 및 위치 절을 사용하십시오.

INSERT INTO Your_table_name_which_you_did_not_tell_us 
    SELECT 'root', attr_key, attr_val, rating, 'ACT' 
    FROM Your_table_name_which_you_did_not_tell_us 
    WHERE status = 'INACT' 

하나의 쿼리에는 삭제 및 삽입 할 수 없습니다.

WHENEVER SQLERROR ROLLBACK; 

BEGIN TRANSACTION; 

DELETE FROM some_table WHERE user_id='root'; 

INSERT INTO some_table 
    SELECT 'root', attr_key, attr_val, rating, 'ACT' 
    FROM some_table 
    WHERE user_id = 'user_1'; 

COMMIT TRANSACTION; 

이렇게하면 삽입이 실패하지 않는 경우에만 삭제를 수행합니다. 또한 트랜잭션이 실행되는 동안 테이블이 수정되지 않도록 잠글 것입니다. (이를 해결할 수있는 명령이 있지만 사람들이 사용하면 무엇을하는지 알기를 바랍니다.)

+0

thanks Hogan. 이것은 내가 찾고있는 것에 가깝게 보인다. 내 원래 질문에서 약간 변경. 남아있는 것은 삽입하기 전에 데이터를 삭제하는 것뿐입니다. 같은 진술에서 어떻게 이것을 할 수 있습니까? – user3222372

+0

@ user3222372 삭제하려는 데이터가 무엇인지 이해할 수 없으므로 그 부분에 대해 도움을 드릴 수 없습니다. – Hogan

+0

Alright @ user3222372 - 나는 대답을 게시했습니다. 아마도 당신이 원하는 것 일 겁니다. – Hogan