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 41084 게시물 읽기
No. 41084
쿼리 질문좀 드릴게요.
작성자
또하루(elqltkfkd)
작성일
2016-02-24 00:34
조회수
8,505

 WITH A_TABLE AS 

(SELECT '1' REGIST_NO, '001' EXCTV_SE_CD, '1' EXCTV_SN, 'A_TEST1' EXCTV_NM FROM DUAL
 UNION ALL SELECT '1' REGIST_NO, '002' EXCTV_SE_CD, '2' EXCTV_SN, 'A_TEST2' EXCTV_NM FROM DUAL
 UNION ALL SELECT '1' REGIST_NO, '003' EXCTV_SE_CD, '3' EXCTV_SN, 'A_TEST3' EXCTV_NM FROM DUAL
 UNION ALL SELECT '2' REGIST_NO, '001' EXCTV_SE_CD, '1' EXCTV_SN, 'A_TEST4' EXCTV_NM FROM DUAL
 UNION ALL SELECT '2' REGIST_NO, '002' EXCTV_SE_CD, '2' EXCTV_SN, 'A_TEST5' EXCTV_NM FROM DUAL
)
,
B_TABLE AS
(SELECT 'A001' REQST_NO, '002' EXCTV_SE_CD, '003' HNF_CHANGE_SE_CD, '4' CHANGE_EXCTV_SN, 'B_TEST1' CHANGE_HNF_NM FROM DUAL
 UNION ALL SELECT 'A001' REQST_NO, '003' EXCTV_SE_CD, '001' HNF_CHANGE_SE_CD, '3' CHANGE_EXCTV_SN, 'B_TEST2' CHANGE_HNF_NM FROM DUAL
 UNION ALL SELECT 'A002' REQST_NO, '003' EXCTV_SE_CD, '001' HNF_CHANGE_SE_CD, '3' CHANGE_EXCTV_SN, 'B_TEST3' CHANGE_HNF_NM FROM DUAL
 UNION ALL SELECT 'A003' REQST_NO, '003' EXCTV_SE_CD, '001' HNF_CHANGE_SE_CD, '3' CHANGE_EXCTV_SN, 'B_TEST4' CHANGE_HNF_NM FROM DUAL
 UNION ALL SELECT 'A003' REQST_NO, '003' EXCTV_SE_CD, '001' HNF_CHANGE_SE_CD, '3' CHANGE_EXCTV_SN, 'B_TEST5' CHANGE_HNF_NM FROM DUAL
)
SELECT *
FROM (SELECT * FROM A_TABLE WHERE REGIST_NO = '1')A
    ,(SELECT * FROM B_TABLE WHERE REQST_NO = 'A001')B
 
위 조건의 데이터을 이용해서 변경전 데이터와 변경후 데이터을 뽑아야되는데요.
 
A_TABLE의 EXCTV_SN , EXCTV_SE_CD 컬럼과 B_TABLE 테이블의 CHANGE_EXCTV_SN, EXCTV_SE_CD 컬럼이 키값입니다.
 
B_TABLE의 HNF_CHANGE_SE_CD컬럼은 001은 변경 003은 추가입니다.
 
변경 및 추가건에 대해서만 데이터을 뽑아야됩니다.
 
--RESULT
 
       bfCol                                          afCol
002(A_TEST2)               002(A_TEST2,B_TEST1)
003(A_TEST3)               003(B_TEST2)
 
위 결과처럼 데이터을 뽑을수 있을까요.
 
도움 부탁드립니다.
이 글에 대한 댓글이 총 8건 있습니다.

오라클에 맞게

문자열만 결합하시면 될겁니다.

하기쿼리 참고하세요

---쿼리시작---

WITH A_TABLE AS

(SELECT '1' REGIST_NO, '001' EXCTV_SE_CD, '1' EXCTV_SN, 'A_TEST1' EXCTV_NM FROM tdual
 UNION ALL SELECT '1' REGIST_NO, '002' EXCTV_SE_CD, '2' EXCTV_SN, 'A_TEST2' EXCTV_NM FROM tdual
 UNION ALL SELECT '1' REGIST_NO, '003' EXCTV_SE_CD, '3' EXCTV_SN, 'A_TEST3' EXCTV_NM FROM tdual
 UNION ALL SELECT '2' REGIST_NO, '001' EXCTV_SE_CD, '1' EXCTV_SN, 'A_TEST4' EXCTV_NM FROM tdual
 UNION ALL SELECT '2' REGIST_NO, '002' EXCTV_SE_CD, '2' EXCTV_SN, 'A_TEST5' EXCTV_NM FROM tdual
)
,
B_TABLE AS
(SELECT 'A001' REQST_NO, '002' EXCTV_SE_CD, '003' HNF_CHANGE_SE_CD, '4' CHANGE_EXCTV_SN, 'B_TEST1' CHANGE_HNF_NM FROM tdual
 UNION ALL SELECT 'A001' REQST_NO, '003' EXCTV_SE_CD, '001' HNF_CHANGE_SE_CD, '3' CHANGE_EXCTV_SN, 'B_TEST2' CHANGE_HNF_NM FROM tdual
 UNION ALL SELECT 'A002' REQST_NO, '003' EXCTV_SE_CD, '001' HNF_CHANGE_SE_CD, '3' CHANGE_EXCTV_SN, 'B_TEST3' CHANGE_HNF_NM FROM tdual
 UNION ALL SELECT 'A003' REQST_NO, '003' EXCTV_SE_CD, '001' HNF_CHANGE_SE_CD, '3' CHANGE_EXCTV_SN, 'B_TEST4' CHANGE_HNF_NM FROM tdual
 UNION ALL SELECT 'A003' REQST_NO, '003' EXCTV_SE_CD, '001' HNF_CHANGE_SE_CD, '3' CHANGE_EXCTV_SN, 'B_TEST5' CHANGE_HNF_NM FROM tdual
)
SELECT A.EXCTV_SE_CD,A.EXCTV_NM,B.EXCTV_SE_CD,B.CHANGE_HNF_NM
FROM (SELECT * FROM A_TABLE WHERE REGIST_NO = '1')A
    ,(SELECT * FROM B_TABLE WHERE REQST_NO = 'A001')B
WHERE A.EXCTV_SE_CD = B.EXCTV_SE_CD   
---쿼리끝---

최한영(terry0515)님이 2016-02-24 09:16에 작성한 댓글입니다.

 답변감사합니다.

 
헌데 EXCTV_SE_CD 값이 중복으로도 들어가지네요.
 
WITH A_TABLE AS 
(SELECT '1' REGIST_NO, '001' EXCTV_SE_CD, '1' EXCTV_SN, 'A_TEST1' EXCTV_NM FROM DUAL
 UNION ALL SELECT '1' REGIST_NO, '001' EXCTV_SE_CD, '2' EXCTV_SN, 'A_TEST2' EXCTV_NM FROM DUAL
 UNION ALL SELECT '1' REGIST_NO, '001' EXCTV_SE_CD, '3' EXCTV_SN, 'A_TEST3' EXCTV_NM FROM DUAL
 
 UNION ALL SELECT '1' REGIST_NO, '003' EXCTV_SE_CD, '4' EXCTV_SN, 'A_TEST4' EXCTV_NM FROM DUAL
 UNION ALL SELECT '2' REGIST_NO, '001' EXCTV_SE_CD, '5' EXCTV_SN, 'A_TEST5' EXCTV_NM FROM DUAL
 UNION ALL SELECT '2' REGIST_NO, '002' EXCTV_SE_CD, '6' EXCTV_SN, 'A_TEST6' EXCTV_NM FROM DUAL
)
,
B_TABLE AS
(SELECT 'A001' REQST_NO, '002' EXCTV_SE_CD, '003' HNF_CHANGE_SE_CD, '4' CHANGE_EXCTV_SN, 'B_TEST1' CHANGE_HNF_NM FROM DUAL
 UNION ALL SELECT 'A001' REQST_NO, '001' EXCTV_SE_CD, '001' HNF_CHANGE_SE_CD, '2' CHANGE_EXCTV_SN, 'B_TEST2' CHANGE_HNF_NM FROM DUAL
 UNION ALL SELECT 'A001' REQST_NO, '001' EXCTV_SE_CD, '001' HNF_CHANGE_SE_CD, '3' CHANGE_EXCTV_SN, 'B_TEST3' CHANGE_HNF_NM FROM DUAL
 
 UNION ALL SELECT 'A002' REQST_NO, '003' EXCTV_SE_CD, '001' HNF_CHANGE_SE_CD, '3' CHANGE_EXCTV_SN, 'B_TEST4' CHANGE_HNF_NM FROM DUAL
 UNION ALL SELECT 'A003' REQST_NO, '003' EXCTV_SE_CD, '001' HNF_CHANGE_SE_CD, '3' CHANGE_EXCTV_SN, 'B_TEST5' CHANGE_HNF_NM FROM DUAL
 UNION ALL SELECT 'A003' REQST_NO, '003' EXCTV_SE_CD, '001' HNF_CHANGE_SE_CD, '3' CHANGE_EXCTV_SN, 'B_TEST6' CHANGE_HNF_NM FROM DUAL
)SELECT *
FROM (SELECT * FROM A_TABLE WHERE REGIST_NO = '1')A
    ,(SELECT * FROM B_TABLE WHERE REQST_NO = 'A001')B
 
A_TABLE테이블이 기존데이터 B_TABLE 테이블이 신규데이터입니다.
 
B_TABLE테이블에 HNF_CHANGE_SE_CD컬럼이 변경인지 신규추가인지 구분합니다(003 : 추가 001 : 변경)
 
위 쿼리조건으로 결과을 얻고싶습니다.
 
--RESULT
   bfCol afCol
001(A_TEST1,A_TEST2,A_TEST3)           001(A_TEST1,B_TEST2,B_TEST3) -- 변경케이스
003(A_TEST4)       003(A_TEST4,B_TEST1)         --추가케이스
또하루(elqltkfkd)님이 2016-02-24 11:29에 작성한 댓글입니다.

첫번째 예시자료도 어딘가 맞질 않는 듯 보이구요.
자료만 봐서는 exctv_se_cd 만 조인하면 될것 처럼 보이네요.
그래서 위와 같은 답변(WHERE A.EXCTV_SE_CD = B.EXCTV_SE_CD )이 달린거구요.


그런데 두번째 예시자료를 보면
exctv_se_cd 와 exctv_sn 을 함께 연결해야 할 듯 보이네요.
그러나, 원본데이터 대비 결과데이터가 일치하지 않네요?
추가된 자료는 '002'의 자료인데 결과엔 '003'에 추가되었네요?


자료를 정비해서 다시 질문해 주셔야 할 듯 한데요.

마농(manon94)님이 2016-02-24 13:23에 작성한 댓글입니다.
이 댓글은 2016-02-24 13:23에 마지막으로 수정되었습니다.
WITH A_TABLE AS 
(SELECT '1' REGIST_NO, '001' EXCTV_SE_CD, '1' EXCTV_SN, 'A_TEST1' EXCTV_NM FROM DUAL
 UNION ALL SELECT '1' REGIST_NO, '001' EXCTV_SE_CD, '2' EXCTV_SN, 'A_TEST2' EXCTV_NM FROM DUAL
 UNION ALL SELECT '1' REGIST_NO, '001' EXCTV_SE_CD, '3' EXCTV_SN, 'A_TEST3' EXCTV_NM FROM DUAL
 UNION ALL SELECT '1' REGIST_NO, '003' EXCTV_SE_CD, '4' EXCTV_SN, 'A_TEST4' EXCTV_NM FROM DUAL
 
 UNION ALL SELECT '2' REGIST_NO, '001' EXCTV_SE_CD, '5' EXCTV_SN, 'A_TEST5' EXCTV_NM FROM DUAL
 UNION ALL SELECT '2' REGIST_NO, '002' EXCTV_SE_CD, '6' EXCTV_SN, 'A_TEST6' EXCTV_NM FROM DUAL
)
,
B_TABLE AS
(SELECT 'A001' REQST_NO, '003' EXCTV_SE_CD, '001' HNF_CHANGE_SE_CD, '4' CHANGE_EXCTV_SN, 'B_TEST1' CHANGE_HNF_NM FROM DUAL
 UNION ALL SELECT 'A001' REQST_NO, '003' EXCTV_SE_CD, '003' HNF_CHANGE_SE_CD, '5' CHANGE_EXCTV_SN, 'B_TEST2' CHANGE_HNF_NM FROM DUAL
 UNION ALL SELECT 'A001' REQST_NO, '001' EXCTV_SE_CD, '001' HNF_CHANGE_SE_CD, '2' CHANGE_EXCTV_SN, 'B_TEST3' CHANGE_HNF_NM FROM DUAL 
 
 UNION ALL SELECT 'A002' REQST_NO, '003' EXCTV_SE_CD, '001' HNF_CHANGE_SE_CD, '3' CHANGE_EXCTV_SN, 'B_TEST4' CHANGE_HNF_NM FROM DUAL
 UNION ALL SELECT 'A003' REQST_NO, '003' EXCTV_SE_CD, '001' HNF_CHANGE_SE_CD, '3' CHANGE_EXCTV_SN, 'B_TEST5' CHANGE_HNF_NM FROM DUAL
 UNION ALL SELECT 'A003' REQST_NO, '003' EXCTV_SE_CD, '001' HNF_CHANGE_SE_CD, '3' CHANGE_EXCTV_SN, 'B_TEST6' CHANGE_HNF_NM FROM DUAL
 )
 SELECT *
FROM (SELECT * FROM A_TABLE WHERE REGIST_NO = '1')A
    ,(SELECT * FROM B_TABLE WHERE REQST_NO = 'A001')B
 
 
아래와 같은형태의 데이터을 표현하고싶습니다.
 
#          BF_CCOLUMN                                           AF_COLUMN
1     001(A_TEST1,A_TEST2,A_TEST3)                     001(A_TEST1,B_TEST3,A_TEST3)
2     003(A_TEST4)                                     003(B_TEST1(변경),B_TEST2(추가))
또하루(elqltkfkd)님이 2016-02-24 14:25에 작성한 댓글입니다.
이 댓글은 2016-02-24 14:26에 마지막으로 수정되었습니다.

SELECT NVL(a.exctv_se_cd, b.exctv_se_cd) exctv_se_cd
     , LISTAGG(a.exctv_nm, ',')
       WITHIN GROUP(ORDER BY NVL(a.exctv_sn, b.change_exctv_sn)) bf
     , LISTAGG(NVL(b.change_hnf_nm, a.exctv_nm), ',')
       WITHIN GROUP(ORDER BY NVL(a.exctv_sn, b.change_exctv_sn)) af
  FROM (SELECT * FROM a_table WHERE regist_no = '1') a
  FULL OUTER JOIN
       (SELECT * FROM b_table WHERE reqst_no  = 'A001') b
    ON a.exctv_se_cd = b.exctv_se_cd
   AND a.exctv_sn = b.change_exctv_sn
 GROUP BY NVL(a.exctv_se_cd, b.exctv_se_cd)
;


변경(001)의 경우 a 와 b 의 sn 이 동일한 것으로 보고
추가(003)의 경우 a 와 b 의 sn 이 다르게 추가되는 것으로 가정하고 작성했습니다.
일단 'A001' 의 자료는 위 가정이 맞는 듯 하네요.
다른 자료들은 sn 값이 가정하고 안 맞네요?

마농(manon94)님이 2016-02-24 14:51에 작성한 댓글입니다.

 한영님 마농님 답변감사합니다.

다른자료는 임의로 제가 급하게 생성한거라 맞질않네요.

한가지 더 질문 드립니다.
 
B_TABLE에 REQST_NO가 A001인것만 출력되게할수있을까요?
 
가령 A_TABLE테이블에 REGIST_NO 가 1인것중에 EXCTV_SE_CD 값이 002로 데이타가 한건더 존재한다면 이값도 가치 출력이되서요.
또하루(elqltkfkd)님이 2016-02-25 09:41에 작성한 댓글입니다.

SELECT NVL(a.exctv_se_cd, b.exctv_se_cd) exctv_se_cd
     , LISTAGG(a.exctv_nm, ',')
       WITHIN GROUP(ORDER BY NVL(a.exctv_sn, b.change_exctv_sn)) bf
     , LISTAGG(NVL(b.change_hnf_nm, a.exctv_nm), ',')
       WITHIN GROUP(ORDER BY NVL(a.exctv_sn, b.change_exctv_sn)) af
  FROM (SELECT * FROM a_table WHERE regist_no = '1') a
  FULL OUTER JOIN
       (SELECT * FROM b_table WHERE reqst_no  = 'A001') b
    ON a.exctv_se_cd = b.exctv_se_cd
   AND a.exctv_sn = b.change_exctv_sn
 GROUP BY NVL(a.exctv_se_cd, b.exctv_se_cd)
 HAVING COUNT(b.exctv_se_cd) > 0    -- 조건 추가(b가 존재하는 것만)
;

마농(manon94)님이 2016-02-25 10:27에 작성한 댓글입니다.

에고 마농님 감사합니다.

 

또하루(elqltkfkd)님이 2016-02-25 21:01에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
41087수정1차) SP 선언시 매개변수를 데이터셋으로 받아서 처리 가능여부? [2]
권순환
2016-02-25
9169
41086pl/sql 에서 dbms_output.put_line 의 성능 문제는 없을까요?
나그네
2016-02-25
7921
41085멀티스레드 분산 select [2]
민주가인
2016-02-25
8448
41084쿼리 질문좀 드릴게요. [8]
또하루
2016-02-24
8505
41083초보가 질문 하나 드립니다. [1]
초보
2016-02-21
8094
41082쿼리 도와 주세욤... ㅜㅜ [2]
덕선이.
2016-02-18
8287
41081리스너(?) 오류?
qazsew
2016-02-18
8116
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다