오라클에서 select한 결과 값 복사 0 12 1,142

by dnfrkwhr [Oracle 기초] [2019.03.19 09:52:21]


이름 값1 값2
A 10 20
B 10 30
C 20 20

안녕하세요. 위와 같은 select한 결과값이 있을경우, 값1이 20일 경우 그행을 똑 같이 복사해서

값1은 20이 아닌 10이 되는 행을 바로 아래와 같이 추가하고 싶습니다. 어떻게 쿼리문을 작성해야 하는지 문의 드립니다.

감사합니다.

이름 값1 값2
A 10 20
B 10 30
C 20 20
C 10 20

 

by 우리집아찌 [2019.03.19 10:00:39]

10이 들어가는 기준을 말해주세요.


by dnfrkwhr [2019.03.19 10:42:52]

값1은 코드 값에 따른 조회 결과 입니다. 코드 1일경우 10, 2일경우 20로, 값1이 20인 행을 복사하되 값1은 다른 값을 가져야 합니다. 


by 이준환 [2019.03.19 10:17:10]
INSERT INTO TABLE_NAME(NAME, VALUE1, VALUE2)
SELECT
  NAME
, '10' AS VALUE1
, VALUE2
FROM TABLE_NAME
WHERE VALUE1 = '20'
;

 


by 꼬랑지 [2019.03.19 10:48:38]

질문의 내용을 확실히 이해는 못하겠으나 아래와 같은 결과를 얻으시려는건가요?

WITH A AS(
    SELECT 'A' NAME, '10' VAL1, '20' VAL2 FROM DUAL UNION ALL
    SELECT 'B' NAME, '10' VAL1, '30' VAL2 FROM DUAL UNION ALL
    SELECT 'C' NAME, '20' VAL1, '20' VAL2 FROM DUAL UNION ALL
    SELECT 'D' NAME, '20' VAL1, '30' VAL2 FROM DUAL UNION ALL
    SELECT 'E' NAME, '30' VAL1, '10' VAL2 FROM DUAL
),B AS (
SELECT LEVEL LV FROM DUAL CONNECT BY LEVEL<=2
)
SELECT
    DECODE(LV,1,NAME,2,NAME2) NAME
    ,DECODE(LV,1,VAL1,2,VAL3) VAL1
    ,DECODE(LV,1,VAL2,2,VAL4) VAL2
FROM (
    SELECT
        NAME,VAL1,VAL2,LV
        ,DECODE(VAL1,'20',NAME) NAME2
        ,DECODE(VAL1,'20','10') VAL3
        ,DECODE(VAL1,'20',VAL2) VAL4
    FROM A,B
    WHERE 1=1
)
WHERE 1=1
AND DECODE(LV,1,NAME,2,NAME2) IS NOT NULL
ORDER BY NAME,VAL1 DESC
;


by 마농 [2019.03.19 10:55:30]

1. 하고자 하는게? 조회(Select)인가요? 입력(Insert)인가요?
2. 20 에 해당하는 10 이 이미 있는 경우는 없나요?
  - 무조건 추가? / 10 이 있는지 확인 후 없으면 추가 ?
3. 코드라는 표현을 쓰셨는데? 코드가 뭔가요?
  - 테이블의 값인지? 조회화면에서의 선택 조건인지? 아니면 다른 건지?


by dnfrkwhr [2019.03.19 11:12:24]

1. 하고자하는건 조회(Select)구요
2. 10 이 있는지 확인 후 없으면 추가
3. 코드값을 가진 테이블이 있습니다.
 


by 마농 [2019.03.19 12:17:13]

코드에 대해 자세히 알려주세요.
이번 쿼리 결과와 어떻게 연관되는지.


by dnfrkwhr [2019.03.19 12:27:16]

아래와 같은 코드값을 가진 테이블이 있습니다.

code name code val
1 10
2 20

이름 C만이 위 코드 테이블code name 1을 가집니다. 이럴경우 아래와 이름C행을 복사하되 값1은 code val인 10이 되어 야 합니다. 최종적인 결과아래와 같습니다.

이름 값1 값2
A 10 20
B 10 30
C 20 20
C 10 20

by 마농 [2019.03.19 13:00:10]

이름 C 만이 코드 1 을 가진다는게 뭘 보고 알 수 있는 건지 모르겠네요?


by dnfrkwhr [2019.03.19 13:26:10]

뭘 보고 알 수 있는게 아니라 조건이죠


by 마농 [2019.03.19 14:04:26]

음...
코드가 조건인지 테이블인지 물었을 때는 테이블이라고 하시고...
테이블간의 연관관계를 물으니 조건이라 하시고...


by 마농 [2019.03.19 14:14:34]
-- 그냥 코드는 없다고 생각하고 풀어 봅니다.
-- C 는 20 만 있어서 복제 대상
-- D 는 10 이 이미 있어서 복제 안함

WITH t AS
(
SELECT 'A' nm, 10 v1, 20 v2 FROM dual
UNION ALL SELECT 'B', 10, 30 FROM dual
UNION ALL SELECT 'C', 20, 20 FROM dual
UNION ALL SELECT 'D', 20, 40 FROM dual
UNION ALL SELECT 'D', 10, 50 FROM dual
)
SELECT nm, v1, v2
  FROM (SELECT nm
             , DECODE(lv, 2, 10, v1) v1
             , v2
             , ROW_NUMBER() OVER(PARTITION BY nm, DECODE(lv, 2, 10, v1) ORDER BY lv) rn
          FROM t
             , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 2)
         WHERE lv <= DECODE(v1, 20, 2, 1)
        )
 WHERE rn = 1
;

WITH t AS
(
SELECT 'A' nm, 10 v1, 20 v2 FROM dual
UNION ALL SELECT 'B', 10, 30 FROM dual
UNION ALL SELECT 'C', 20, 20 FROM dual
UNION ALL SELECT 'D', 20, 40 FROM dual
UNION ALL SELECT 'D', 10, 50 FROM dual
)
SELECT nm, v1, v2
  FROM t
 UNION ALL
SELECT a.nm
     , 10 v1
     , a.v2
  FROM t a
     , t b
 WHERE a.v1    = 20
   AND b.v1(+) = 10
   AND b.nm(+) = a.nm
   AND b.nm   IS NULL
 ORDER BY 1, 2
;

 

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