일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- perl + 정규표현식
- grid
- memory
- php5
- dba
- command & perl
- Network
- prompt
- 연산자
- fdisk
- Linux
- solaris network
- mariaDB
- sqlplus
- 오라클
- solaris
- patch
- oracle install
- Oracle RAC
- perl string
- oracle
- Unix
- cygwin
- MySQL
- rac
- PERL
- SQL
- bash
- perl one-liner
- RHEL4
Archives
- Today
- Total
DATA 전문가로 가는 길
[SQL] MariaDB/MySQL 테이블 비교(Compare two table) 본문
Data Architecture/SQL Query
[SQL] MariaDB/MySQL 테이블 비교(Compare two table)
EstenPark 2019. 7. 29. 16:46두 테이블에 대한 컬럼 속성 정보를 비교하는 쿼리를 작성합니다.
아래는 우선 두 테이블의 데이터를 비교해서 같지 않은 항목을 추출한 후에 row 형태로 변경 합니다.
1. 테이블 생성
/* 현재 사용자 정보 */ CREATE TABLE EST_CURR_USER (USER_NO INT NOT NULL PRIMARY KEY, "USER_NM" varchar(100) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, "USER_GRP_NM" varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL , "USER_DESC" varchar(200) CHARACTER SET utf8 COLLATE utf8_bin ) ENGINE=INNODB; /* 변경 사용자 정보 */ CREATE TABLE EST_CHG_USER (USER_NO INT NOT NULL PRIMARY KEY, "USER_NM" varchar(100) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, "USER_GRP_NM" varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL , "USER_DESC" varchar(200) CHARACTER SET utf8 COLLATE utf8_bin ) ENGINE=INNODB;
2. 샘플 데이터 생성 - EST_CURR_USER
- 현재 사용자 정보를 생성 합니다.
INSERT INTO EST_CURR_USER (USER_NO,USER_NM,USER_GRP_NM,USER_DESC) VALUES (140,'TEST','DB팀','관리권한자') ,(11011,'TEST11','DB팀',NULL) ,(11020,'TEST1010','백앤드팀',NULL) ,(11021,'TEST1111','백앤드팀',NULL) ,(11022,'TEST1212','백앤드팀','백앤드 파이썬') ,(11211,'TEST111','백앤드팀',NULL) ,(11212,'TEST122','백앤드팀','백앤드 자바 ') ,(11220,'TEST11010','백앤드팀','백앤드 자바 ') ,(11221,'TEST11111','DB팀','관리권한자') ,(11222,'TEST11212','백앤드팀','백앤드 자바 ') ; INSERT INTO EST_CURR_USER (USER_NO,USER_NM,USER_GRP_NM,USER_DESC) VALUES (11223,'TEST11313','DB팀','관리권한자') ,(11224,'TEST11414','백앤드팀',NULL) ,(11225,'TEST11515','백앤드팀',NULL) ,(11226,'TEST11616','백앤드팀',NULL) ,(11227,'TEST11717','백앤드팀',NULL) ,(11228,'TEST11818','백앤드팀',NULL) ,(11229,'TEST11919','DB팀','관리권한자') ,(11230,'TEST12020','파생상품팀','파생 상품 관리팀') ,(11231,'TEST12121','파생상품팀',NULL) ,(11232,'TEST12222','파생상품팀',NULL) ; INSERT INTO EST_CURR_USER (USER_NO,USER_NM,USER_GRP_NM,USER_DESC) VALUES (11233,'TEST12323','파생상품팀',NULL) ,(11234,'TEST12424','DB팀','관리권한자') ,(11235,'TEST12525','파생상품팀',NULL) ,(11236,'TEST12626','파생상품팀',NULL) ,(11237,'TEST12727','파생상품팀',NULL) ,(11310,'TEST1100100','클라우드기술팀',NULL) ,(21811,'TEST11','클라우드기술팀',NULL) ,(21812,'TEST22','DB팀',NULL) ,(21814,'TEST44','DB팀',NULL) ,(21821,'TEST1111','DB팀',NULL) ; INSERT INTO EST_CURR_USER (USER_NO,USER_NM,USER_GRP_NM,USER_DESC) VALUES (21826,'TEST1616','DB팀',NULL) ,(21828,'TEST1818','클라우드기술팀','클라우드 기술 분석가') ,(21829,'TEST1919','클라우드기술팀','클라우드 기술 분석가') ,(21830,'TEST2020','클라우드기술팀','클라우드 기술 분석가') ,(21831,'TEST2121','클라우드기술팀','클라우드 기술 분석가') ,(21832,'TEST2222','DB팀',NULL) ,(21833,'TEST2323','클라우드기술팀','클라우드 기술 분석가') ,(21834,'TEST2424','클라우드기술팀','클라우드 기술 분석가') ,(21835,'TEST2525','클라우드기술팀',NULL) ,(21836,'TEST2626','DB팀',NULL) ; INSERT INTO EST_CURR_USER (USER_NO,USER_NM,USER_GRP_NM,USER_DESC) VALUES (21837,'TEST2727','클라우드기술팀',NULL) ,(21838,'TEST2828','DB팀',NULL) ,(21839,'TEST2929','클라우드기술팀',NULL) ,(21840,'TEST3030','클라우드기술팀',NULL) ,(21841,'TEST3131','클라우드기술팀',NULL) ,(21842,'TEST3232','클라우드기술팀',NULL) ,(21843,'TEST3333','DB팀',NULL) ,(21844,'TEST3434','클라우드기술팀',NULL) ,(21845,'TEST3535','DB팀','관리권한자') ,(21846,'TEST3636','클라우드기술팀',NULL) ; INSERT INTO EST_CURR_USER (USER_NO,USER_NM,USER_GRP_NM,USER_DESC) VALUES (21847,'TEST3737','클라우드기술팀',NULL) ,(21848,'TEST3838','클라우드기술팀',NULL) ,(21849,'TEST3939','클라우드기술팀',NULL) ,(21850,'TEST4040','클라우드기술팀',NULL) ,(21851,'TEST4141','DB팀','관리권한자') ,(21852,'TEST4242','클라우드기술팀',NULL) ,(21853,'TEST4343','파생상품팀',NULL) ,(21854,'TEST4444','파생상품팀',NULL) ,(21855,'TEST4545','파생상품팀',NULL) ,(21856,'TEST4646','파생상품팀','파생 상품 관리팀') ; INSERT INTO EST_CURR_USER (USER_NO,USER_NM,USER_GRP_NM,USER_DESC) VALUES (21857,'TEST4747','DB팀','관리권한자') ,(21858,'TEST4848','파생상품팀','파생 상품 관리팀') ,(21859,'TEST4949','파생상품팀','파생 상품 관리팀') ,(21860,'TEST5050','파생상품팀','파생 상품 관리팀') ,(21861,'TEST5151','파생상품팀','파생 상품 관리팀') ,(21862,'TEST5252','DB팀','관리권한자') ,(21863,'TEST5353','파생상품팀','파생 상품 관리팀') ,(21864,'TEST5454','파생상품팀','파생 상품 관리팀') ,(21868,'TEST5858','DB팀','관리권한자') ,(21871,'TEST6161','DB팀','관리권한자') ; INSERT INTO EST_CURR_USER (USER_NO,USER_NM,USER_GRP_NM,USER_DESC) VALUES (21874,'TEST6464','DB팀','관리권한자') ,(21875,'TEST6565','파생상품팀','파생 상품 관리팀') ,(21876,'TEST6666','파생상품팀','파생 상품 관리팀') ,(21877,'TEST6767','DB팀','관리권한자') ,(21878,'TEST6868','백앤드팀',NULL) ,(21879,'TEST6969','백앤드팀',NULL) ,(21880,'TEST7070','백앤드팀',NULL) ,(21881,'TEST7171','백앤드팀','백앤드 자바 ') ,(21882,'TEST7272','DB팀','관리권한자') ,(21883,'TEST7373','DB팀','관리권한자') ; INSERT INTO EST_CURR_USER (USER_NO,USER_NM,USER_GRP_NM,USER_DESC) VALUES (21884,'TEST7474','파생상품팀','파생 상품 관리팀') ,(21885,'TEST7575','파생상품팀','파생 상품 관리팀') ,(21886,'TEST7676','DB팀','관리권한자') ,(21910,'TEST100100','파생상품팀','파생 상품 관리팀') ;
3. 샘플 데이터 생성 - EST_CHG_USER
- 변경된 사용자 정보를 생성 합니다.
IINSERT INTO EST_CHG_USER (USER_NO,USER_NM,USER_GRP_NM,USER_DESC) VALUES (140,'TEST','DB팀','관리권한자') ,(11011,'TEST11','데이터분석팀','TEST') ,(11020,'TEST1010','백앤드팀',NULL) ,(11021,'TEST1111','백앤드팀',NULL) ,(11022,'TEST1212','백앤드팀','백앤드 파이썬') ,(11211,'TEST111','백앤드팀',NULL) ,(11212,'TEST122','백앤드팀','백앤드 자바 ') ,(11221,'TEST11111','DB팀','관리권한자') ,(11222,'TEST11212','백앤드팀','백앤드 총괄') ,(11223,'TEST11313','DB팀','관리권한자') ; INSERT INTO EST_CHG_USER (USER_NO,USER_NM,USER_GRP_NM,USER_DESC) VALUES (11224,'박수철','백앤드팀',NULL) ,(11225,'박이선','백앤드팀',NULL) ,(11226,'TEST11616','백앤드팀',NULL) ,(11227,'TEST11717','백앤드팀',NULL) ,(11229,'TEST11919','DB팀','관리권한자') ,(11230,'TEST12020','파생상품팀','파생 상품 관리팀') ,(11231,'TEST12121','파생상품팀',NULL) ,(11232,'TEST12222','파생상품팀',NULL) ,(11234,'TEST12424','DB팀','관리권한자') ,(11235,'TEST12525','파생상품팀',NULL) ; INSERT INTO EST_CHG_USER (USER_NO,USER_NM,USER_GRP_NM,USER_DESC) VALUES (11236,'TEST12626','파생상품팀',NULL) ,(11237,'TEST12727','파생상품팀',NULL) ,(11310,'TEST1100100','클라우드기술팀',NULL) ,(21812,'TEST22','DB팀',NULL) ,(21813,'TEST33','클라우드기술팀',NULL) ,(21814,'TEST44','DB팀',NULL) ,(21815,'홍길동','클라우드기술팀',NULL) ,(21816,'TEST66','클라우드기술팀','클라우드 기술 분석가') ,(21820,'TEST1010','클라우드기술팀','클라우드 기술 분석가') ,(21822,'TEST1212','클라우드기술팀','클라우드 기술 분석가') ; INSERT INTO EST_CHG_USER (USER_NO,USER_NM,USER_GRP_NM,USER_DESC) VALUES (21823,'TEST1313','클라우드기술팀','클라우드 기술 분석가') ,(21824,'TEST1414','클라우드기술팀','클라우드 기술 분석가') ,(21825,'TEST1515','클라우드기술팀','클라우드 기술 분석가') ,(21826,'TEST1616','DB팀',NULL) ,(21827,'제임스','클라우드기술팀','클라우드분석가') ,(21828,'TEST1818','클라우드기술팀','클라우드분석가') ,(21829,'TEST1919','클라우드기술팀','클라우드분석가') ,(21830,'TEST2020','클라우드기술팀','클라우드분석가') ,(21831,'TEST2121','클라우드기술팀','클라우드분석가') ,(21832,'TEST2222','데이터분석팀',NULL) ; INSERT INTO EST_CHG_USER (USER_NO,USER_NM,USER_GRP_NM,USER_DESC) VALUES (21833,'TEST2323','클라우드기술팀','클라우드 기술 분석가') ,(21834,'TEST2424','클라우드기술팀','테스트분석가') ,(21835,'TEST2525','클라우드기술팀','클라우드분석가') ,(21836,'TEST2626','DB팀',NULL) ,(21837,'TEST2727','클라우드기술팀',NULL) ,(21838,'브라이언','DB팀',NULL) ,(21839,'TEST2929','클라우드기술팀',NULL) ,(21840,'TEST3030','클라우드기술팀',NULL) ,(21841,'TEST3131','클라우드기술팀',NULL) ,(21842,'TEST3232','클라우드기술팀',NULL) ; INSERT INTO EST_CHG_USER (USER_NO,USER_NM,USER_GRP_NM,USER_DESC) VALUES (21843,'TEST3333','DB팀',NULL) ,(21844,'TEST3434','클라우드기술팀',NULL) ,(21845,'TEST3535','DB팀','관리권한자') ,(21846,'TEST3636','클라우드기술팀',NULL) ,(21847,'토마스','클라우드기술팀',NULL) ,(21848,'TEST3838','클라우드기술팀',NULL) ,(21849,'TEST3939','클라우드기술팀',NULL) ,(21850,'TEST4040','클라우드기술팀',NULL) ,(21851,'TEST4141','DB팀','관리권한자') ,(21852,'TEST4242','클라우드기술팀',NULL) ; INSERT INTO EST_CHG_USER (USER_NO,USER_NM,USER_GRP_NM,USER_DESC) VALUES (21853,'르브론','파생상품팀',NULL) ,(21854,'TEST4444','파생상품팀',NULL) ,(21855,'TEST4545','파생상품팀',NULL) ,(21856,'TEST4646','파생상품팀','파생 상품 관리팀') ,(21857,'TEST4747','DB팀','관리권한자') ,(21858,'TEST4848','파생상품팀','파생 상품 관리팀') ,(21859,'TEST4949','파생상품팀','파생 상품 관리팀') ,(21860,'어빙','파생상품팀',NULL) ,(21861,'TEST5151','파생상품팀','파생 상품 관리팀') ,(21862,'TEST5252','데이터분석팀','관리권한자') ; INSERT INTO EST_CHG_USER (USER_NO,USER_NM,USER_GRP_NM,USER_DESC) VALUES (21863,'TEST5353','파생상품팀','파생 상품 관리팀') ,(21864,'TEST5454','파생상품팀','파생 상품 관리팀') ,(21865,'탐슨','파생상품팀','파생 상품 관리팀') ,(21866,'TEST5656','파생상품팀','파생 상품 관리팀') ,(21867,'TEST5757','파생상품팀','파생 상품 관리팀') ,(21868,'TEST5858','데이터분석팀','관리권한자') ,(21869,'TEST5959','파생상품팀','파생 상품 관리팀') ,(21870,'TEST6060','파생상품팀','파생 상품 관리팀') ,(21871,'커리','데이터분석팀','관리권한자') ,(21872,'TEST6262','파생상품팀','파생 상품 관리팀') ; INSERT INTO EST_CHG_USER (USER_NO,USER_NM,USER_GRP_NM,USER_DESC) VALUES (21873,'TEST6363','파생상품팀','파생 상품 관리팀') ,(21874,'TEST6464','DB팀','관리권한자') ,(21875,'TEST6565','파생상품팀','파생 상품 관리팀') ,(21876,'TEST6666','파생상품팀','파생 상품 관리팀') ,(21877,'손흥민','DB팀','관리권한자') ,(21878,'TEST6868','백앤드팀',NULL) ,(21879,'TEST6969','백앤드팀',NULL) ,(21880,'TEST7070','백앤드팀',NULL) ,(21881,'TEST7171','백앤드팀','백앤드 자바 ') ,(21882,'TEST7272','DB팀','관리권한자') ; INSERT INTO EST_CHG_USER (USER_NO,USER_NM,USER_GRP_NM,USER_DESC) VALUES (21883,'TEST7373','DB팀','관리권한자') ,(21884,'박지성','파생상품팀','파생 상품 관리팀') ,(21885,'TEST7575','파생상품팀','파생 상품 관리팀') ,(21886,'TEST7676','DB팀','관리권한자') ,(21910,'TEST100100','파생상품팀','파생 상품 관리팀') ;
4. 두 테이블 비교 쿼리
- 변경된 데이터를 기준으로 원본 데이터를 비교해서 결과를 추출합니다.
- 변경 전/후 동일한지 비교 여부(Y/N)에 따라서 같지 않은 데이터를 추출해서 비교 대상 항목에 따라 row로 변경 합니다.
- row로 변경된 컬럼을 다시 항목별로 데이터를 정리합니다.
SELECT A.USER_NO ,A.NAME ,A.BF_VALUE ,A.AF_vALUE FROM ( SELECT A.USER_NO ,CASE WHEN B.RN = 1 THEN 'User Name' WHEN B.RN = 2 THEN 'User group Name' WHEN B.RN = 3 THEN 'User Description' END AS NAME ,CASE WHEN B.RN = 1 AND A.USER_NM_CHG_YN = 'N' THEN BF_USER_NM WHEN B.RN = 2 AND A.USER_GRP_NM_CHG_YN = 'N' THEN BF_USER_GRP_NM WHEN B.RN = 3 AND A.USER_DESC_CHG_YN = 'N' THEN BF_USER_DESC ELSE NULL END AS BF_VALUE ,CASE WHEN B.RN = 1 AND A.USER_NM_CHG_YN = 'N' THEN AF_USER_NM WHEN B.RN = 2 AND A.USER_GRP_NM_CHG_YN = 'N' THEN AF_USER_GRP_NM WHEN B.RN = 3 AND A.USER_DESC_CHG_YN = 'N' THEN AF_USER_DESC ELSE NULL END AS AF_VALUE FROM ( SELECT A.USER_NO ,A.USER_NM AS AF_USER_NM ,B.USER_NM AS BF_USER_NM ,CASE WHEN IFNULL(A.USER_NM, '#NULL#') = IFNULL(B.USER_NM, '#NULL#') THEN 'Y' ELSE 'N' END USER_NM_CHG_YN ,A.USER_GRP_NM AS AF_USER_GRP_NM ,B.USER_GRP_NM AS BF_USER_GRP_NM ,CASE WHEN IFNULL(A.USER_GRP_NM, '#NULL#') = IFNULL(B.USER_GRP_NM, '#NULL#') THEN 'Y' ELSE 'N' END USER_GRP_NM_CHG_YN ,A.USER_DESC AS AF_USER_DESC ,B.USER_DESC AS BF_USER_DESC ,CASE WHEN IFNULL(A.USER_DESC, '#NULL#') = IFNULL(B.USER_DESC, '#NULL#') THEN 'Y' ELSE 'N' END USER_DESC_CHG_YN FROM EST_CHG_USER A /* 변경된 데이터를 기준 */ INNER JOIN EST_CURR_USER B ON (B.USER_NO = A.USER_NO) ) A, (SELECT SEQ AS RN FROM seq_1_to_3) B /* 항목 기준으로 카티션 곱 */ WHERE 'N' IN (A.USER_NM_CHG_YN, A.USER_GRP_NM_CHG_YN, A.USER_DESC_CHG_YN) /* [조건] 변경된 항목 조회 */ ) A WHERE A.BF_VALUE IS NOT NULL OR A.AF_VALUE IS NOT NULL ;
[결과]
|USER_NO |NAME |BF_VALUE |AF_VALUE | |-----------|----------------|--------------------|-----------------| |11011 |User group Name |DB팀 |데이터분석팀 | |11011 |User Description| |TEST | |11222 |User Description|백앤드 자바 |백앤드 총괄 | |11224 |User Name |TEST11414 |박수철 | |11225 |User Name |TEST11515 |박이선 | |21828 |User Description|클라우드 기술 분석가 |클라우드분석가 | |21829 |User Description|클라우드 기술 분석가 |클라우드분석가 | |21830 |User Description|클라우드 기술 분석가 |클라우드분석가 | |21831 |User Description|클라우드 기술 분석가 |클라우드분석가 | |21832 |User group Name |DB팀 |데이터분석팀 | |21834 |User Description|클라우드 기술 분석가 |테스트분석가 | |21835 |User Description| |클라우드분석가 | |21838 |User Name |TEST2828 |브라이언 | |21847 |User Name |TEST3737 |토마스 | |21853 |User Name |TEST4343 |르브론 | |21860 |User Name |TEST5050 |어빙 | |21860 |User Description|파생 상품 관리팀 | | |21862 |User group Name |DB팀 |데이터분석팀 | |21868 |User group Name |DB팀 |데이터분석팀 | |21871 |User Name |TEST6161 |커리 | |21871 |User group Name |DB팀 |데이터분석팀 | |21877 |User Name |TEST6767 |손흥민 | |21884 |User Name |TEST7474 |박지성 |
'Data Architecture > SQL Query' 카테고리의 다른 글
[SQL] MariaDB/MySQL 테이블 일련번호 중간에 빈 값 찾기 (0) | 2019.07.24 |
---|---|
[SQL] Oracle Merge 문법 자동 생성기(PL/SQL) (0) | 2017.09.25 |
[SQL] MariaDB/MySQL MAX/MIN 최고값 최저값의 세부 속성 데이터 활용하기(최고일시, 최저일시 등) (0) | 2017.03.24 |
[SQL] Oracle 필수 스크립트 모음(딕셔너리, SQL 문법, 성능 분석) (0) | 2017.03.13 |
[SQL] MariaDB/Mysql 구분자(콤마, 파이프라인 등등)를 기준으로 열(row) 변환 (2) | 2017.02.16 |
Comments