left join 시 데이터 수에 따라 조건절을 다르게 줄 수 있을까요? 0 3 412

by 동글222 [2018.11.22 13:26:28]


SELECT A.KEY, A.NAME, B.STAT
FROM A
LEFT JOIN B
ON A.KEY = B.KEY
( B에 A의 키와 일치하는 데이터가 두개 있을경우 "상태"가 "등록"인 데이터를 뽑고 싶습니다.)

TABLE A              TABLE B

KEY  NAME          KEY   STAT
 1    민수           1     등록
 2    철수           1     해지
 3    창수

결과
KEY NAME  STAT
 1   민수   등록
 2   철수   NULL
 3   창수   NULL

 

위처럼 B테이블에 A테이블에 해당하는 데이터가 두개인 경우 위와 같이 결과를 뽑고싶습니다.ㅠㅠ

by 마농 [2018.11.22 13:34:09]

예를 들어 주실때 다양한 예를 섞어 주세요.
 - 1개 있을 때 / 2개 있을 때 / 없을 때 / 2개 이상도 가능한지?
 - 상태는 등록 / 해지 2가지 뿐인지?
 - 여러 상태 중 하나를 선택하는 기준은 뭔지?
 - 등록이 여러개 가능한지? 해지가 여러개 가능한지?
 - 해지만 있는 경우도 있는지?
 - 어떤 형태는 가능하고 어떤 형태는 불가능 한지 등등..


by 동글222 [2018.11.22 13:53:02]

 질문이 미숙하여 죄송합니다..

다시 정리하였습니다..!

 

B테이블에는 A테이블과 매칭되는 데이터가 무수히 있을 수 있으며, 상태 컬럼이 KEY는 아니지만 "등록"인 데이터는 하나 뿐입니다.
"해지" 상태는 여러 건 있을 수 있구요.
상태는 현재는 "해지", "등록" 두개이지만 추 후 두개 코드가 더 추가될 예정입니다.

해당 KEY의 등록 데이터가 존재할 경우, 신규등록 시 기존 등록 데이터는 상태를 "해지"로 업데이트하고, 신규등록 데이터를 INSERT시킵니다.

해지 상태인 데이터만 있을 수도 있습니다.
이 경우는 최신 데이터를 불러오고싶습니다.

등록/해지 상태인 데이터가 있다면 등록상태인 데이터를 우선으로 불러오고 싶습니다.


TABLE A                                       TABLE B
CODE(PK) PART(PK) NUMB(PK) NAME                  CODE(PK) PART(PK) NUMB(PK) BANK(PK) B_NUMB(PK) STAT  INSERT_DATE
   1                 1       101      민수                            1       1        101      001     123456     해지     2018-11-01
   1                 1       102      철수                            1       1        101      002     546213     해지     2018-11-02
   1                 1       103      창수                            1       1        101      003     456125     등록     2018-11-03
  
결과

CODE   PART   NUMB   NAME   BANK   STAT  
  1          1     101    민수    003     등록 
  1          1     102    철수    NULL    NULL
  1          1     103    창수    NULL    NULL


by 마농 [2018.11.22 14:19:47]
SELECT *
  FROM (SELECT a.code
             , a.part
             , a.numb
             , a.name
             , b.bank
             , b.stat
             , ROW_NUMBER() OVER(PARTITION BY a.code, a.part, a.numb ORDER BY b.insert_date DESC) rn
          FROM table_a a
          LEFT OUTER JOIN table_b b
            ON a.code = b.code 
           AND a.part = b.part 
           AND a.numb = b.numb
        )
 WHERE rn = 1
;

 

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