데이터 체크 쿼리 0 6 687

by 캔디는맛있어 [Toad] 오라클 쿼리 [2021.10.12 19:54:24]


아래와 같이 테이블의 결과가 나올라면 어떻게 해야할까요;;;

 

머리가 쿼리쪽으로는 안돼어서 고생이네요 ㅠㅠ

 

주석도 작성해주시면 감사합니다.

 

A-table     B-table
필드명 no name     필드명 no NAME NUM
데이터 1 A     데이터 1 A 1
2 A     2 A 1
3 A     4 B 1
4 B     5 B 1
5 B     6 C 1
6 C     8 C 2
7 C     9 C 2
8 C            
9 C            
                 
                 
                 
                 
결과        
필드명 no NAME NUM Check        
데이터 1 A 1 N        
2 A 1 N        
3 A   N        
4 B 1 Y        
5 B 1 Y        
6 C 1 N        
7 C   N        
8 C 2 N        
9 C 2 N        
by 마농 [2021.10.13 10:07:15]

결과표가 살짝 애매하네요.
C 의 경우 7번 자료가 6번과 묶여서 N 이 나오는데
7번이 6번과 묶여야 하는 근거가 뭘까요?
7번이 8,9번과 묶일수도 있지 않은지?
C 의 b.num 이 1 과 2 로 나뉘는 듯 한데
b.num 이 null 인 7번이 1에 속할지 2에 속할지 어떻게 판단하나요?


by 캔디는맛있어 [2021.10.13 10:25:41]

제가 결과를 잘못생각했네요 수정했습니다


by 캔디는맛있어 [2021.10.13 10:27:20]

name을 기준으로 해서 num이 없으면 check는 무조건 N num이 있으면 Y로 되게 하면되는거 인데

결과를 잘못 생각했습니다. 죄송합니다.


by 마농 [2021.10.13 10:30:37]
WITH tab_a AS
(
SELECT 1 no, 'A' name FROM dual
UNION ALL SELECT 2, 'A' FROM dual
UNION ALL SELECT 3, 'A' FROM dual
UNION ALL SELECT 4, 'B' FROM dual
UNION ALL SELECT 5, 'B' FROM dual
UNION ALL SELECT 6, 'C' FROM dual
UNION ALL SELECT 7, 'C' FROM dual
UNION ALL SELECT 8, 'C' FROM dual
UNION ALL SELECT 9, 'C' FROM dual
)
, tab_b AS
(
SELECT 1 no, 'A' name, 1 num FROM dual
UNION ALL SELECT 2, 'A', 1 FROM dual
UNION ALL SELECT 4, 'B', 1 FROM dual
UNION ALL SELECT 5, 'B', 1 FROM dual
UNION ALL SELECT 6, 'C', 1 FROM dual
UNION ALL SELECT 8, 'C', 2 FROM dual
UNION ALL SELECT 9, 'C', 2 FROM dual
)
SELECT a.no
     , a.name
     , b.num
     , MIN(NVL2(b.num, 'Y', 'N')) OVER(PARTITION BY a.name) chk
  FROM tab_a a
     , tab_b b
 WHERE a.no = b.no(+)
-- AND a.name = b.name(+) -- 이 조건이 필요할지 아리송?
 ORDER BY no
;

 


by 캔디는맛있어 [2021.10.13 13:53:44]

조회 조건에 " AND NUM = '1' " 을 추가 하면

전부 Y라고 나옵니다.

제가 생각하는 결과는 아래와 같이 나와야한다고 생각이 들고요;;;

아래와 같이 나오는건 불가능할까요 ㅠㅠ

NO NAME NUM CHK
1 A 1 N
2 A 1 N
4 B 1 Y
5 B 1 Y
6 C 1 N

by 마농 [2021.10.13 14:14:28]
SELECT *
  FROM (SELECT a.no
             , a.name
             , b.num
             , MIN(NVL2(b.num, 'Y', 'N')) OVER(PARTITION BY a.name) chk
          FROM tab_a a
             , tab_b b
         WHERE a.no = b.no(+)
        -- AND a.name = b.name(+) -- 이 조건이 필요할지 아리송?
         ORDER BY no
        )
 WHERE num = 1
;

 

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