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
운영게시판
최근게시물
Oracle Q&A 40112 게시물 읽기
No. 40112
여러 무림 고수님들 (Select후 결과 Update) 문의 드립니다.
작성자
허접떼기
작성일
2013-04-26 09:52ⓒ
2013-04-26 10:27ⓜ
조회수
6,222

Select 결과를 Update 하려 합니다.

Update [table1] t1
Set (Column1, Column2, .... Column5) = (Select Column1, Column2, ... Column5
                                                                           From [table2] t2
                                                                           Where t1.Column1 = t2.Column2
                                                                           AND t2.Column2 = 'A')
Where Exist
(Select Column1, Column2, ... Column5
  From [table2] t2
 Where t1.Column1 = t2.Column2
 AND t2.Column2 = 'B')

 

이렇게 t2에서 조회된 값으로 t1을 업데이트 하려 합니다.

그런데... 문제는...

Set 절에 들어가는 Select 문과

Exist 절에 들어가는 Select문이 다를 때는 어떻게 해야하나요?

예를 들어 아래 쿼리와 같이

Exist 절에서 해당 데이터가 있는지 확인하고,

Set 절에 값으로 업데이트 시 그 값을 'A'로 변경하여 넣고 싶을 경우 말입니다.

 

Update [table1] t1
Set (Column1, Column2, .... Column5) = (Select 'A' as Column1, Column2, ... Column5
                                                                           From [table2] t2
                                                                           Where t1.Column1 = t2.Column2
                                                                           AND t2.Column2 = 'A')
Where Exist
(Select Column1, Column2, ... Column5
  From [table2] t2
 Where t1.Column1 = t2.Column2
 AND t2.Column2 = 'B') 

대표 고수님 마농님을 비롯한 다른 많은 무림고수님들의 도움 부탁드립니다.

pl-sql이나, 프로그램적으로 아닌... 쿼리로만은 불가능한가요? ㅠㅠ

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

SET 부분은 그대로 사용하시면 되고요.

EXISTS 는 값의 존재유무만 체크해주면 되기때문에 컬럼값은 가져오지 않아도 됩니다.


 

 Where Exists (Select 'x'

 

               From [table2] t2
              Where t1.Column1 = t2.Column2
                AND t2.Column2 = 'B' )
아린(arin76)님이 2013-04-26 10:12에 작성한 댓글입니다.
이 댓글은 2013-04-26 11:08에 마지막으로 수정되었습니다.

아린님 답변 감사드립니다.

작성한 내용을 보니 빠뜨린 부분이 있어 본문 수정/추가 하였습니다.

 

업데이트 할 t1 테이블의 컬럼을

t2에서 컬럼1이 t1과 동일하고,

컬럼2의 값이 'B'인 항목을 찾아서,

 

t1 테이블에 업데이트 시

컬럼2의 값이 'A'인 값으로 업데이트 해주려 합니다.

이 경우도 아린님이 말씀하신대로 하면 되는지요? ㅠㅠ

 

필수값에 null을 업데이트 하려고 한다고 (ora-01407) 에러 또는

update row 가 '0'이 되네요...ㅠㅠ

허접떼기님이 2013-04-26 10:26에 작성한 댓글입니다. Edit

set 부분의 조건부분도 exists 부분처럼  AND t2.Column2 = 'B' 로 하셔야 합니다.

 

수정할 데이터는 t2.Column2 = 'B' 에 있는 데이터를 'A' 로 변경하는 것이기 때문에

당연히 아직 변경되지 않은   AND t2.Column2 = 'A' 값은 null(no row) 이죠.

 

 Update [table1] t1
Set (Column1, Column2, .... Column5) = (Select 'A' as Column1, Column2, ... Column5
                                                                           From [table2] t2
                                                                           Where t1.Column1 = t2.Column2
                                                                           AND t2.Column2 = 'B')
Where Exists
(Select Column1, Column2, ... Column5
  From [table2] t2
 Where t1.Column1 = t2.Column2
 AND t2.Column2 = 'B') 

아린(arin76)님이 2013-04-26 10:38에 작성한 댓글입니다.
이 댓글은 2013-04-26 11:08에 마지막으로 수정되었습니다.

먼저 답변 감사드립니다^^

방법이 있지 않을까 하고...

어제부터 방법이 없을까 많이 고생했는데...

약간 허무하기도 하네요...

방법이 있을 줄 알았는데;;;;

프로그래밍으로 해결해야 될 것 같네요;;

 

허접떼기님이 2013-04-26 10:42에 작성한 댓글입니다. Edit

 바로 위 방법으로 하면 되지 않나요?

다른 문제가 있나요?

아린(arin76)님이 2013-04-26 10:47에 작성한 댓글입니다.

UPDATE [table1] t1
   SET (Column1, Column2, .... Column5)
     = (SELECT 'A' as Column1, Column2, ... Column5
          FROM [table2] t2
         WHERE t1.Column1 = t2.Column2
           AND t2.Column2 = 'A'
        )
 WHERE EXIST
       (SELECT 1
          FROM [table2] t2
         WHERE t1.Column1 = t2.Column2
           AND t2.Column2 = 'A'
        )
   AND t1.Column2 = 'B'
;

마농(manon94)님이 2013-04-26 11:16에 작성한 댓글입니다.

UPDATE
(
      SELECT 'A' AS Column1_v
           , Column2_v
           .....
        FROM [table1] t1
           , [table2] t2
       WHERE t1.Column1 = t2.Column2
         AND t2.Column2 = 'A'
         AND t1.Column2 = 'B'
) SET Column1 = Column1_v
      ...

채용근(taiji97)님이 2013-04-26 13:54에 작성한 댓글입니다.

아린님, 마농님 답변 감사합니다 ㅠㅠ

제가 원하는 바를 쭈~욱 설명해두고... 쓰기 완료 누를려는데...

화면이 먹통되어... 잠시 멘붕을 겪고... 마음을 추스리고 다시 작성합니다.ㅠㅠ

제가 EXIST를 제대로 이해하지 못하고 있는 것 같아...

먼저 제가 원한느 바를 설명드리겠습니다.

 

t1

c1 c2 c3 c4 c5
114 B W1 P1 P2
114 B W2 P3 P4
114 M      
359 Z      

t2

c1 c2 c3 c4 c5
114 B W1 P5 P6
114 B W2 P7 P8
359 A V1 O1 O2
359 A V2 O3 O4

t1(result)

c1 c2 c3 c4 c5
359 A V1 O1 O2
359 A V2 O3 O4
359 Z      

 

t2의 c1='114', c2='B' 와 같은 데이터를 t1에서 찾아서,

찾은 값을 t2의 c1='359' c2='A'의 데이터로 업데이트 하는것을 원합니다.

 그래서 제가 짠 쿼리에는 Set 절과 Exist 절이 달랐던 것 입니다. ㅠㅠ;; 

 

마농님 답변을 주셨는데도 잘 안되네요..ㅠㅠ;;

오늘도 내공 부족을 절실히 느끼네요;;;

허접떼기님이 2013-04-26 13:54에 작성한 댓글입니다. Edit

답변 달아주는 사람들 허무하게 .... 말씀을 하시네요

 

정확히 설명을 하면은 제대로 된 답변이 달리겠죠.

채용근(taiji97)님이 2013-04-26 13:55에 작성한 댓글입니다.

채용근님 죄송해요;;;

처음부터 제가 저렇게 설명을 드렸으면, 좋았을 터인데,

두서 없이 적다보니.. 제대로 된 설명을 못드린것 같습니다.

답변 주신분들 번거롭게 해드려 죄송합니다.

아무튼 답변 감사드립니다.

허접떼기님이 2013-04-26 14:06에 작성한 댓글입니다. Edit

질문을 정리해서 다시 하셨군요. ^-^

그런데...질문이 완전 산으로 가네요. 도저히 이해 불가입니다.

원하는 것이 Join 이나 Update 가 아닐 수도 있습니다.

질문을 좀 더 정리해 보세요. ㅡ,.ㅡ

마농(manon94)님이 2013-04-26 14:19에 작성한 댓글입니다.
이 댓글은 2013-04-26 14:20에 마지막으로 수정되었습니다.

혹시 이런걸 원하신게 아닐런지?
DELETE FROM t1 WHENE c1 = 114;
INSERT INTO t1 SELECT * FROM t2 WHERE c1 = 359;


혹시 이런걸 원하신게 아닐런지?
DELETE FROM t1 WHENE c1 IN (SELECT c1 FROM t2 WHERE c2 = 'B');
INSERT INTO t1 SELECT * FROM t2 WHERE c2 = 'A';

마농(manon94)님이 2013-04-26 14:22에 작성한 댓글입니다.
이 댓글은 2013-04-26 14:34에 마지막으로 수정되었습니다.

 t1 과 t2 테이블의 key 컬럼이 c1,c2,c3 까지 인가요?


t2 테이블의 114(c1) 값들과 359(c1) 값들이 여려개인데, 그냥 순서대로 매칭하나요?

(순서대로면 order by 규칙은 어떻게 되는지)


t1 테이블의 114(c1) M(c2)  => 이 row 는 왜 사라졌나요?

(삭제해야 되는지..)


 

아린(arin76)님이 2013-04-26 14:23에 작성한 댓글입니다.

헉... 죄송합니다.

정리한다고 했는데...  또 혼란만 야기했네요;;

Row가 하나 누락됐네요;;;

 

t1(result)

c1 c2 c3 c4 c5
359 A V1 O1 O2
359 A V2 O3 O4
114 M      
359 Z      

 

 

테이블 키는 3입니다.

t2테이블에는 따로 order는 하지 않았습니다만, order도 영향을 끼치는지요;;

 

 

허접떼기님이 2013-04-26 14:46에 작성한 댓글입니다. Edit
마농님이 말씀하신대로 아래 쿼리로 결과가 나올것 같은데요.

 
DELETE FROM t1 WHERE c1 = 114 AND c2 = 'B';

 
INSERT INTO t1 SELECT * FROM t2 WHERE c1 = 359;
아린(arin76)님이 2013-04-26 14:50에 작성한 댓글입니다.

t1           t2           t3        
c1 c2 c3 c4 c5   c1 c2 c3 c4 c5   c1 c2 c3 c4 c5
114 B W1 P1 P2 <-> 114 B W1 P5 P6 <-> 359 A V1 O1 O2
114 B W2 P3 P4 <-> 114 B W2 P7 P8 <-> 359 A V2 O3 O4
114 M                              
359 Z                              

위와 같이 3개 집합이 있다고 보시고

t1 과 t2 의 관계는 c1, c2, c3 가 같은지로 체크 가능합니다.

t2 와 t3 의 관계는 뭘로 체크할까요?

위 데이터만으로는 감을 잡을 수가 없습니다.

마농(manon94)님이 2013-04-26 15:13에 작성한 댓글입니다.

아린님, 마농님 답변 감사드립니다.

두 분 아니었으면,

되는 줄 알고 계속 용쓰면서 삽질만 하고 있었겠네요;;

 

허접떼기님이 2013-04-26 16:32에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
40115Oracle 잡스케쥴 등록을 해보려합니다.
새하정
2013-04-29
6033
40114프로시져생성을 하려합니다.. [5]
새하정
2013-04-26
6812
40113쿼리 문의좀 드립니다. [3]
김진수
2013-04-26
6206
40112여러 무림 고수님들 (Select후 결과 Update) 문의 드립니다. [17]
허접떼기
2013-04-26
6222
40111insert update 두가지를 동시에 처리를 하려고 합니다. [1]
오라클
2013-04-26
7723
40110insert 와 update를 동시에 못 하나요? [1]
오라클
2013-04-25
6055
40109트리거 스크립트를 수정하고 싶습니다.
초보
2013-04-25
5515
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다