database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
ㆍDB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
DB2 Q&A 1742 게시물 읽기
No. 1742
with statement와 함께 update를 쓰려 합니다.
작성자
짝퉁헤리포터(bh1004)
작성일
2008-10-29 00:26
조회수
10,402

현재 사용하고 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가 불가능한 것인가요?


아시는 분은 답변 부탁드립니다.

이 글에 대한 댓글이 총 1건 있습니다.

덧글 시작에 앞서, Oracle에서는  with절이라고 불렀던 것 같은데, with절을 (common) Table Expression 이라고 부르네요.


편법을 사용하여 본 문제를 해결하기는 했습니다.

1. global temporary table을 미리 생성해 놓고,

2. TE의 결과를 temp table에 insert했습니다.

3. temp table과 원본 table ( schm1.tbl_source )를 join 하여 schem1.tbl_source를 update

하였습니다.


Temp table을 사용하지 않고, TE를 이용하여 update하는 것은 여전히 방법을 모르겠네요.

update시에 TE에 지정되지 않은 table을 적으면 오류가 나서, 이를 방지하고자 TE내에 원본  table을 기술해 주어도 문제는 해결되지 않는군요.


Table expression을 사용하여 update를 해 보신 분이 계시다면 조언 부탁드리겠습니다. (가능하면 예제 code도 함께.. ^^ )

짝퉁헤리포터(bh1004)님이 2008-10-31 03:44에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
1748db2look 질문입니다. [1]
이도희
2008-11-05
8981
1747FixPack 종류 중 Regular FixPack과 Alternate FixPak 차이점이 뭔가요? [1]
짝퉁헤리포터
2008-11-05
9143
1746DB2 일본어 버전 데이터베이스 설치
김윤정
2008-11-03
8633
1742with statement와 함께 update를 쓰려 합니다. [1]
짝퉁헤리포터
2008-10-29
10402
1741Rolllback take too long [1]
Hyung
2008-10-25
8628
1740table 생성시에. [1]
이도희
2008-10-24
9345
1738DB2 윈도우용 ODBC 드라이브구함 [2]
이경화
2008-10-23
8744
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2021 DSN, All rights reserved.
작업시간: 0.012초, 이곳 서비스는
	PostgreSQL v13.3으로 자료를 관리합니다