홈 > 질문과답변 > QnA
전체     개발      설치      튜닝      쿼리      관리      백업      SAP on DB2      마이그레이션      기타   
 
merge 로 쿼리 변경 관련 질문입니다.
| 2010-02-05 15:05:26
안녕하세요
sybase 를 쓰고 있다가 여기 있는 update 쿼리를 변경하려고 하는 중
merge 라는 부분으로 바꾸려 하는 막히는 부분이 있어서 글을 남깁니다.
사이베이스 쿼리는 다음과 같습니다.
================================
update CUSTOMER A
set  A.custid = (case when B.RO_ID is null 
                                         then case when C.SC_NUM 
                                                            then 0
                                                  else 1
                                                  end
                               else '    '
                               end)
from CUSTOMER A , (select rid,num from STAFF  where B.rid='1') B,(select rid,num from EMP  where rid='0') C
where A.rid *=B.rid
and     B.num *=C.num
and    A.custid  <> '0'
                                              
 
modify List
덕만이 2010-02-18 20:00:27
update from절 입니다. sybase ASE, MS SQL 2000,2005에서 다른 테이블의 정보를 사용하여 수정하는 예시죠. (delete from절도 있음)
Merge 문으로 변경가능합니다. ^^ 지금쯤 이미 답을 얻었을 것 같네요. 간단 변경 예시 보냅니다.
변경전>
UPDATE Sales SET ord_date = s.ord_date +1
FROM Sales s JOIN Stores t
ON s.stor_id = t.stor_id
WHERE t.state = 'WA'

DB2 9.7로 변경후>>
merge into Sales s
using (select stor_id, state from stores where state = 'WA') t
ON s.stor_id = t.stor_id
when matched then
update set ord_date = s.ord_date +1 day
장미향기 2010-02-23 18:08:17
B.RO_ID가 rid 컬럼이고, C.SC_NUM은 num 컬럼, case when C.SC_NUM 은 case when C.SC_NUM is null 이 원문이라는 전제하에 위 문장은 아래와 같이 변경할 수 있습니다.
먼저 merge 문을 이용하는 것은 위 분께서 제시하신 내용을 참조할 수 있는데, 이를 반영하여 변경해 보면 다음과 같습니다.

merge into CUSTOMER a
using (select a.rid, b.rid as RO_ID, c.num as SC_NUM
from CUSTOMER a left outer join STAFF b on (a.rid=b.rid)
left outer join EMP c on (b.num=c.num)
where a.custid <> '0') d
on a.rid = d.rid
when matched then
update set a.custid = (case when d.RO_ID is null
then case when d.SC_NUM is null then '0' else '1' end
else ' ' end);

또 한가지 방법은 update 문장을 그대로 사용하는 것인데, 이는 다음과 같습니다.

update CUSTOMER a
set custid = (select (case when min(b.rid) is null
then case when min(c.num) is null then '0' else '1' end
else ' ' end)
from STAFF b left outer join EMP c on (b.num=c.num)
where b.rid = a.rid)
where a.custid <> '0';

이 문장에서 set 절의 서브쿼리에 min 그룹함수를 사용한 것은 customer와 staff이 아우터조인이 되는 것이 원래 질문의 의도인데, min 없이 서브쿼리를 사용할 경우 customer의 rid 와 조인되는 staff의 rid가 없으면 서브쿼리 결과가 그냥 null 이 되어버려서 당초 의도한 customer와 staff을 아우터조인한 상태를 만들수 없기 때문입니다. set절의 서브쿼리에 그룹함수를 사용하면 대응하는 집합이 없는 경우 null row를 리턴하여 case 문을 수행할 수 있게 됩니다.
참고로, 오라클의 경우는 customer가 키보존테이블이라는 제약조건을 만족할 경우 customer, staff, emp 간의 아우터조인 문장을 뷰쿼리로 만들어 바로 update를 수행할 수 있습니다. 이것을 updatable join view라고 합니다.
답변이 늦었지만 도움이 되셨길 바랍니다.
 
번호 제목 작성자 조회 등록일
1741 초보의 insert 질문입니다. 흐린가을 2010-09-10
1740 DB2 LOAD유틸의 초고수님들께 질문드립니다!!!...  (1) db2chobo 2010-09-07
1739 DB2(IBM cloud)와 안드로이드를 연동하려고 합니다....  (1) 독재자 2010-09-07
1738 DB2 버전별 어떤 DRDA 프로토콜 버전을 사용하나요?... 뭉게뭉게 2010-09-06
1737 오라클 db링크 하는 방법 또는 데이타 가져오는 방법 문의...  (1) alva 2010-09-03
1736 ODBC가 제대로 설치되었는지 확인해보세요...  (1) 플로리스트 2010-09-03
1735 파티션 테이블에서 특정 파티션 데이타 조회...  (1) 이산 2010-09-02
1734 db2 개발에 사용되는 함수리스트 좀 구할 수 없나요?...  (3) Hot 무무 2010-09-01
1733 ASP 연동시 일부 data가 안넘어갑니다.  (1) 즈니 2010-08-31
1732 oracle table default option 변환 관련 문의입니다.... oh33408 2010-08-30
1731 oracle 10gR2 -> db2 9.7 테스트중인데.. 궁금한게 있어서..... Hot 헤파이토스 2010-08-26
1730 DB2와는 관계없는 질문입니다만..  (1) Hot 언제나학생 2010-08-26
1729 DB2 웹 연동중 질문입니다 ..  (1) Hot 즈니 2010-08-24
1728 에러코드 질문 하나 올립니다.  (7) Hot 언제나학생 2010-08-24
1727 DB2 초보 질문 하나 올립니다..  (6) Hot 최병문 2010-08-22
1726 DB2에 생성한 db를 ASP에 connect하는법  (1) Hot 즈니 2010-08-20
1725 ESQL 개발중 PREPROCESSOR 사용시 주석 처리는?... Hot 옵티마이져 2010-08-20
1724 [ 질문 ] ORACLE -> DB2 변환 질문입니다.  (1) Hot silvertail 2010-08-19
1723 여전히 설치시 에러가 뜹니다.  (2) Hot 즈니 2010-08-19
1722 variance 결과값이, 엑셀과 다릅니다.  (1) Hot 뽀꺼 2010-08-19
 1 ㆍ 2 ㆍ 3 ㆍ 4 ㆍ 5 ㆍ 6 ㆍ 7 ㆍ 8 ㆍ 9 ㆍ 10 ㆍ Next  
 
이용약관    |    개인정보보호정책    |    운영자메일  
KDUGDB2 LUW 9.5 기반에서 운영되고 있습니다.