SQL문에서 3단 JOIN 이상 한 상태에 해당값이 없으면 JOIN된 해당값 가져오기

SQL문에서 3단 JOIN 이상 한 상태에 해당값이 없으면 JOIN된 해당값 가져오기

QA

SQL문에서 3단 JOIN 이상 한 상태에 해당값이 없으면 JOIN된 해당값 가져오기

본문

contents 테이블

r_wr_id bo_table title
23 free  
45 game '안해요'

 

g5_write_free 테이블

wr_id at_create subject
23   '안녕하세요'
     

 

g5_write_game 테이블

wr_id at_create subject
45   '게임해요'
     

 

g5_write_notice 테이블

wr_id at_create subject
53   '공지사항입니다.'
     

SELECT *

FROM contents AS C 
LEFT JOIN g4_write_free AS F
ON (C.r_wr_id = F.wr_id) 
LEFT JOIN g4_write_game AS G 
ON (C.r_wr_id = G.wr_id) 

LEFT JOIN g4_write_notice AS N 
ON (C.r_wr_id = N.wr_id) 
WHERE C.r_bo_table = "free" OR C.r_bo_table = "game" OR C.r_bo_table = "notice"

 

 

 contents 테이블 기준으로 

LEFT JOIN 해서 출력하는 SQL문입니다.

 

매칭 경우는 contents 테이블의 r_wr_id 와 해당 테이블의 wr_id로 매칭하게 됩니다.

 

문제는 만약 contents의 테이블의 title NULL 값이면

해당 테이블 JOIN한 매칭된 subject 값을 가져올려고 합니다.

 

반대로 contents의 테이블의title값이 있다면 그냥 여기서 가져올려고 합니다.

 

일단 제가 고민한것은

 

IFNULL(C.title, subject) AS title  

 를 이용해서 할려고 하지만 

 

JOIN 한게 3개 이상이라 이렇게는 안되네요 ㅠ,ㅠ

 

혹시 좋은 방법은 없을까요?

 

 

이 질문에 댓글 쓰기 :

답변 3

LEFT OUTER JOIN 으로 세개 테이블을 join 한다면,

content 테이블과 1:1 이 된 경우만 해당 테이블의 title 값이 존재하게 됩니다.

그외에는 모두 NULL 이기 때문에 4개 테이블의 title의 값중에 null 이 아닌것을 하나 가져오면 됩니다.

 

outer join  시  wr_id 가 중복되면서 title도 여러개 있는 경우는 발생하지 않습니다. 

 


SELECT a.r_wr_id, a.bo_table
      , IFNULL(a.title, IFNULL(F.title, IFNULL(G.title, N.title))) title
FROM contents AS C 
LEFT JOIN g4_write_free AS F
ON (C.bo_tble='free' and C.r_wr_id = F.wr_id) 
LEFT JOIN g4_write_game AS G 
ON (C.bo_table = 'game' and C.r_wr_id = G.wr_id) 
LEFT JOIN g4_write_notice AS N 
ON (C.bo_table='notice' and C.r_wr_id = N.wr_id) 
LIMIT 10

select ifnull(f.title,ifnull(g.title,ifnull(n.title,subject))) title 

 

와 같이 처리하시면 되지 않을까 싶네요

만약 g5_write_free 테이블  하고 g5_write_game 테이블
이 wr_id이 같은 값이라면

g5_write_game 테이블의 제목을 뽐고 싶은데

g5_write_free  테이블의 제목을 뽐게 되는 문제가 발생되지 않을까요?

출력하려는 순서를 잘 정하셔야 올바른 결과가 나올겁니다.

 

제가 쿼리문을 일부만 적은건 패턴이 저런 방식으로 사용가능하단느것을 보여드린것이고

mysql if 문으로 처리할때

php if 문과 같이 접근하셔서 판단하시면 되지 않을까 싶습니다.

left join 은 oracle 에서 outer join 과 비슷합니다.

 

if문은 다른 dbms 의  decode 혹은 with case 와 유사하다고 볼수있는것이죠

단지 프로그램코드와 좀더 친숙한 패턴이니

판단 자체가 좀더 수월하시지 않을까 싶네요

 

ifnull 말고도 if 문이 있으니

적절하게 잘 사용하시면 원하시는결과를 도출할수있을겁니다.

 

조건절에서

정확한 접근순서로 정리하시면되는데

 

복잡해진다면 굳이 sql문 하나로 다 풀지 말고

결과를 가져와서 판단후 재조회하는게 더 유용합니다.

답변을 작성하시기 전에 로그인 해주세요.
전체 123,117 | RSS
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT