SQL 업무 처리중 어려움을 겪고 있어 이렇게 도움을 청해봅니다. 0 4 759

by 기그스 [SQL Query] [2018.05.09 21:53:07]


A컬럼 B컬럼 C컬럼 D컬럼
1 A000 S L
2 B000 S S
3 A000 S S
4 C000 S L

 

 

안녕하세요.

업무중 어려움을 겪고 있어 이렇게 도움을 청해봅니다.

위의 표는 제가 하고자하는 데이터를 간단히 표로 만든것인데요.

B컬럼을 보시면 1번/3번행의 데이터가 A000 있고,

해당 ROW의 D컬럼을 보시면 1번 L / 3번 S 이렇게 데이터가 있습니다

하고자하는것은 B컬럼 기준으로 A000처럼 동일한 값중 D컬럼의 데이터들을 S를  L로 바꾸고 싶습니다

D컬럼의 3번째열의 데이터 S -> L 이렇게죠

결국 쿼리 조회 이벤트가 발생하면 먼저 B컬럼의 A000인 데이터값들은 모두 D컬럼에서 L로 가공을 하고 싶은것입니다.

내부 조회시 제가 하고자하는 값으로 데이터 변환을 해서 인라인뷰형태로 가지고 있으려고요.

인라인뷰형태로 데이터를 가공한후, 바깥 쿼리문에서 D컬럼의 L인 데이터만을 다시 조건으로 써서 값을 뽑아내려고 하는 것입니다.

다시 말씀드리면, B컬럼 기준으로 B컬럼값중 D컬럼에 L이 있으면,

L이 있었던 동일한 B컬럼의 데이터에 해당하는 D컬럼은 모두 S->L로 바꾸고 싶습니다.

도움을 주시면 감사하겠습니다.

감사합니다.

쿼리수행전 데이터

A컬럼 B컬럼 C컬럼 D컬럼
1 A000 S L
2 B000 S S
3 A000 S S
4 C000 S S
5 D000 S L
6 D000 S S

쿼리 수행후 데이터

A컬럼 B컬럼 C컬럼 D컬럼
1 A000 S L
2 B000 S S
3 A000 S L
4 C000 S S
5 D000 S L
6 D000 S L

 

by 마농 [2018.05.10 09:07:24]
-- 1. 갱신 대상 확인용 쿼리 --
SELECT *
  FROM t
 WHERE b IN (SELECT b FROM t WHERE d = 'L')
   AND d = 'S'
;
-- 2. 갱신 쿼리 --
UPDATE t
   SET d = 'L'
 WHERE b IN (SELECT b FROM t WHERE d = 'L')
   AND d = 'S'
;

 


by 기그스 [2018.05.10 09:15:40]

마농님, 우선 답변 감사드립니다.

제 글이 이해하시는데 어려움을 드

렸나봅니다.

물리적 업데이트를 치려는것이 아니고 조회쿼리 내부에서 인라인뷰형태로 가공해서 만든후 바깥쪽 select문에서 가공된 데이터를 가져다 쓰려 한것입니다.

이해가 되실련지요?


by 마농 [2018.05.10 10:33:25]
WITH t AS
(
SELECT 1 a, 'A000' b, 'S' c, 'L' d FROM dual
UNION ALL SELECT 2, 'B000', 'S', 'S' FROM dual
UNION ALL SELECT 3, 'A000', 'S', 'S' FROM dual
UNION ALL SELECT 4, 'C000', 'S', 'S' FROM dual
UNION ALL SELECT 5, 'D000', 'S', 'L' FROM dual
UNION ALL SELECT 6, 'D000', 'S', 'S' FROM dual
)
SELECT a
     , b
     , c
     , MIN(d) OVER(PARTITION BY b) d
  FROM t
 ORDER BY a
;

 


by 기그스 [2018.05.10 12:32:21]

마농님, 많은 도움이 됐습니다.

감사합니다

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입