두 테이블에 서로 연결되는 COL1,COL2값이 있다고했을때(한쪽(T1)을 기준으로 다른한쪽(T2)은 없을수도 있을수도있음)
T2테이블의 총 카운트로 T1테이블에 있다면 누적으로 카운트? 차감이되서 있는지 없는지 확인하는 형식의 쿼리를 짜고싶습니다 ㅠㅜ..
#T1.
COL1 COL2
01 2
01 2
02 3
02 3
02 6
03 4
04 5
#T2
COL1 COL2
01 2
01 4
02 3
02 6
#. RESULT
COL1 COL2 FLAG
01 2 O
01 2 X
02 3 O
02 3 X
02 6 O
03 4 X
04 5 X
결과는 맞는 것 같은데..참고 되시면 좋겠네요~ with절 말고 아래 쿼리만 보시면 됩니다~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | with t1 (col1, col2) as ( select '01' , 2 from dual union all select '01' , 2 from dual union all select '02' , 3 from dual union all select '02' , 3 from dual union all select '02' , 6 from dual union all select '03' , 4 from dual union all select '04' , 5 from dual ), t2 (col1, col2) as ( select '01' , 2 from dual union all select '01' , 4 from dual union all select '02' , 3 from dual union all select '02' , 6 from dual ) select col1, col2, case when rn = 2 or t2col2 is null then 'X' else 'O' end flag from ( select t1.col1 col1, t1.col2 col2, row_number() over (partition by t1.col1, t1.col2 order by t1.col1) rn, t2.col2 t2col2 from t1 left outer join t2 on t1.col1=t2.col1 and t1.col2=t2.col2 ) |
중복을 제거하면 되지 않을까요?
1 2 3 4 5 | select col1, col2, case when rn = 2 or t2col2 is null then 'X' else 'O' end flag from ( select t1.col1 col1, t1.col2 col2, row_number() over (partition by t1.col1, t1.col2 order by t1.col1) rn, t2.col2 t2col2 from t1 left outer join ( select distinct col1, col2 from t2) t2 on t1.col1=t2.col1 and t1.col2=t2.col2 ) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | WITH T1 (COL1, COL2 ) AS ( SELECT '01' , 2 FROM DUAL UNION ALL SELECT '01' , 2 FROM DUAL UNION ALL SELECT '02' , 3 FROM DUAL UNION ALL SELECT '02' , 3 FROM DUAL UNION ALL SELECT '02' , 6 FROM DUAL UNION ALL SELECT '03' , 4 FROM DUAL UNION ALL SELECT '04' , 5 FROM DUAL ), T2 (COL1, COL2 ) AS ( SELECT '01' , 2 FROM DUAL UNION ALL SELECT '01' , 4 FROM DUAL UNION ALL SELECT '02' , 3 FROM DUAL UNION ALL SELECT '02' , 6 FROM DUAL ) -- 이런 의도 인거 같아요. SELECT TT1.COL1, TT1.COL2, DECODE(TT2.RN1, NULL , 'X' , '0' ) AS FLAG FROM ( SELECT COL1, COL2, ROW_NUMBER() OVER(PARTITION BY COL1, COL2 ORDER BY COL1, COL2) AS RN1 FROM T1 ) TT1 LEFT JOIN ( SELECT COL1, COL2, ROW_NUMBER() OVER(PARTITION BY COL1, COL2 ORDER BY COL1, COL2) AS RN1 FROM T2 ) TT2 ON TT1.COL1 = TT2.COL1 AND TT1.COL2 = TT2.COL2 AND TT1.RN1 = TT2.RN1 ORDER BY 1, 2 |
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 32 33 34 | WITH t1 AS ( SELECT '01' col1, 2 col2 FROM dual UNION ALL SELECT '01' , 2 FROM dual UNION ALL SELECT '02' , 3 FROM dual UNION ALL SELECT '02' , 3 FROM dual UNION ALL SELECT '02' , 6 FROM dual UNION ALL SELECT '03' , 4 FROM dual UNION ALL SELECT '04' , 5 FROM dual ) , t2 AS ( SELECT '01' col1, 2 col2 FROM dual UNION ALL SELECT '01' , 4 FROM dual UNION ALL SELECT '02' , 3 FROM dual UNION ALL SELECT '02' , 6 FROM dual ) SELECT a.col1 , a.col2 , NVL2(b.rn, 'O' , 'X' ) flag FROM ( SELECT col1, col2 , ROW_NUMBER() OVER(PARTITION BY col1, col2 ORDER BY 1) rn FROM t1 ) a LEFT OUTER JOIN ( SELECT col1, col2 , ROW_NUMBER() OVER(PARTITION BY col1, col2 ORDER BY 1) rn FROM t2 ) b ON a.col1 = b.col1 AND a.col2 = b.col2 AND a.rn = b.rn ORDER BY a.col1, a.col2, a.rn ; |