2014-07-15 3 views
2

이 질문에 대한 많은 오류가 있음을 발견했습니다. 매우 유사하지만 매우 적절한 시나리오는 아닙니다. 의심 할 여지없이 여기 내 무지가 빛날 것입니다.새 데이터 삽입 및 기존 데이터 업데이트를위한 DB2 SQL 문

테이블에

, 주어진 값이 주어진 열에없는 경우 데이터의 행을 삽입하거나 경우 해당 행을 업데이트 다음과 같이 DB2와 지식의 조각을 사용하여

, 내 시나리오는 값 입니다. 병합 여기에 모든 다른에 하나 개의 테이블을 병합 중심으로 돌고있는 것 같다 대부분의 예제와 철저한 토론과 올바른 경로를 경우

는 내가 확실하지 않다 테이블

id, bigint, not nullable 
ref,varchar, nullable 

있습니다. 나는 단순히 사용자 입력을 수집하고 그것을 추가하거나 업데이트하는 것이다. 정말 간단해야 할 것 같습니다.

저는 이것을 수행하기 위해 jdbc와 준비된 명령문을 사용하고 있습니다.

정확히 일치하는 방법입니까?

DB2 제어 센터 내 쿼리를 테스트, 내가

에 대해 최대 실행 "어떤 행이, UPDATE를 가져 오거나 삭제에 대한 찾을 수 없습니다, 또는 쿼리의 결과는 빈 테이블"

또는 내 병합 구조에 따라 다른 여러 가지 오류가 있습니다. 여기 내가 현재 가지고있는 것이있다. 내가 한다면

merge into table1 as t1 
using (select id from table1 group by id) as t2 
on t1.id = t2.id 
when matched then update set t1.ref = 'abc' 
when not matched then insert (t1.id, t1.ref) values (123, 'abc'); 

대신삽입 뒤에 갱신을 구성; 새 데이터의 경우 삽입이 실행되고 업데이트가 실패하고 기존 데이터의 경우 둘 다 성공하여 표의 데이터가 잘못 표시됩니다 (예 : 두 개의 동일한 행.

id = 1 
ref = a 

새로운 행이 추가된다 : 초기 값으로 사용하는 경우에

원하는 결과이다. 값이 다음으로 변경되면 이후 사용시 :

id = 1 
ref = b 

id = 1 인 행이 업데이트됩니다. 후속 사용은 동일한 규칙을 따릅니다.

어떻게이 문구를 더 잘 표현할 수 있는지 알려주십시오.

업데이트 id는 자동 증가 키가 아닙니다. 그것은 고유 한 외부 키이지만 우리가 참조하는 모든 것이 업데이트하려고하는 테이블에서 관련된 행을 필요로하지는 않습니다. 이 테이블은 자체적으로 구조화되지 않지만 더 큰 데이터 모델의 일부입니다.

+1

T2는'table1'의 각'id '를 포함하고 있기 때문에'when not matched'조건이 어떻게 가능할 것으로 기대되는지 명확하지 않습니다. 오류를 준 정확한 ** MERGE 명령문입니까? – user2338816

+1

ID가 자동 증가 기본 키라고 가정 할 때 삽입하는 동안 키를 전달해서는 안됩니다. 또한 자동 기본 키가 있으면 다른 고유 키가 정의되어 있어야합니다. "나쁜 데이터"를 삽입 할 수 있으면 테이블이 올바르게 정의되지 않았습니다. – Charles

+0

@ user2338816 - 정확히 동일한 검색어가 아닙니다. 테이블의 이름을 변경하여 테이블을 읽기 쉽게 만들었지 만 실제로 사용하고있는 테이블에 100 % 매핑합니다. 귀하의 의견에 동의하고 제공된 ID와 비교하기 위해 on (조건)을 변경하려고 시도했지만 비정상적인 결과도 발생했습니다. 당신이 말하는 것은 의미가 있지만 작동하지 않기 때문에 위의 질문은 밀접한 관련이 있습니다.이 유스 케이스에 접근하는 올바른 방법조차 있습니까? –

답변

4

귀하의 질문에 약간의 혼란이 있습니다. 텍스트를 읽으면 다음과 같은 것을 원하는 것으로 의심됩니다.

merge into table1 as t1 
using (values (123, 'abc')) as t2 (id, ref) 
    on t1.id = t2.id 
when matched then update 
    set t1.ref = t2.ref 
when not matched then 
    insert (id, ref) values (t2.id, t2.ref); 

맞습니까?

+0

그게 내가 필요한 것입니다. 고맙습니다. 나는이 구조의 대부분을 올바르게 사용하지 못했다는 것을 당신의 대답에서 알 수 있습니다! "내 베이컨을 구해 줬다"라는 것도 당신에게 줄 수 있기를 바랍니다. –

+0

@Lennart 2 행에 사용자 값 대신 table2 값을 추가하는 방법 –

+0

@PraveenRKaruppannan, 두 번째 테이블에서 값을 선택한다는 의미입니까? – Lennart