현재 사용하고 DB2정보는 DB2 V8.2 32bit PF16 for Linux 입니다.
하고자 하는 일은
schm1.tbl_source |
schm2.tbl_reference |
"Id"
"ServiceNumber" - varchar (255) Nullable
:
"Origin"
: |
"Id"
"ServiceNumber" - varchar(255) Nullable
:
"Name"
: |
1. tbl_source 의 "Origin" 과 tbl_reference의 "Name" 이 일치하는 것 중,
2. 양 table의 "ServiceNumber"가 다른 것을 찾아
3. tbl_reference의 "ServiceNumber"의 값으로 tbl_source의 "ServiceNumber"를 update
하려고 합니다.
그래서 with statement를 써서 1,2 의 값을 찾아 냈고, with statement로 만든 임시(?) table을 이용하여 tbl_source를 update하려고 하는데 문법이 맞지 않는 것인지, 아니면 사용하는 db2에서 지원을 하지 않는 것인지 잘 모르겠습니다. 지금까지 만든 query는 이렇습니다.
with
tbl_temp ( "SId", "SSN", "RId", "RSN" ) as (
select s."Id", case when s."ServiceNumber" is null then 'S-Null' else s."ServiceNumber" end case,
r."Id", case when r."ServiceNumber" is null then 'R-Null' else r."ServiceNumber" end case,
from schm1.tbl_source s, schm2.tbl_reference r
where s."Origin" = r."Name"
),
tbl_temp2 ( "SId", "SSN", "RId", "RSN" ) as (
select tmp1."SId", tmp1."SSN", tmp1."RId", tmp1."RSN"
from tbl_temp tmp1, tbl_temp tmp2
where tmp1."Id" = tmp2."Id"
and tmp1."SSN" <> tmp2."RSN" -- ( NULL 허용 ) 어느 한 쪽이 null이 되어 버리면, 비교를 못 하는 것 같아 위에서 case 문 처리했습니다.
order by tmp1."SId"
)
1)
SELECT * FROM tbl_tmp2;
2)
UPDATE schm1.tbl_source src
SET src."ServiceNumber" = tmp2."ServiceNumber"
FROM schm1.tbl_source src, tbl_temp2 tmp2
WHERE src."Id" = tmp2."Id";
문제는 1)만 있을 경우에는 제가 원하는 결과의 임시테이블이 잘 만들어져 있습니다. 그런데 2)를 적용하면 ( * 이때, 1)은 주석처리 ) 다음과 같은 error message를 넘깁니다.
SQL0104N An unexpected token "." was found following "."SId" ) UPDATE schm1".
Expected tokens may include: "JOIN". SQLSTATE=42601
다른 Merge 문을 써 봐도 같은 error를 냅니다.
아무래도 with statement 다음에 join형식으로 update를 하기 위해서는 뭔가가 있는 것 같은데, 제가 그 부분을 놓치고 있는 것 같습니다. 아니면, with statement로는 join 형식의 update가 불가능한 것인가요?
아시는 분은 답변 부탁드립니다.
|