by 도뎡이 [SQL Query] mysql outer join [2022.02.15 09:51:10]
안녕하세요, 선배님들.
아래의 SQL 쿼리에서 PASS(LEFT OUTER JOIN) 테이블을 서브 쿼리 형식으로 조회하는데요.
서브 쿼리 형식이 아닌, 일반적인 조인 형식으로 변경할 수 있을까요?
선배님들의 소중한 피드백 미리 감사드립니다!
SELECT
FAM.*
FROM
family AS FAM -- 가족
INNER JOIN client AS ME ON FAM.me_client_id = ME.client_id -- 본인
INNER JOIN client AS OTHER ON FAM.other_client_id = OTHER.client_id -- 상대방
LEFT OUTER JOIN (
SELECT client_id, MAX(passport_id)
FROM passport
GROUP BY client_id
) AS PASS ON OTHER.client_id = PASS.client_id -- 여권
WHERE
FAM.me_client_id = 1038
가능은 한데?
현재 쿼리는 조인 자체가 필요 없는 쿼리입니다.
조인되는 테이블들의 컬럼은 전혀 조회를 하지 않고 있네요.
마농 선생님 답변 감사드립니다!
현재 작성한 SQL은 임시로 작성한 SQL 쿼리입니다 :)
"현재 쿼리는 조인 자체가 필요 없는 쿼리이다"라고 말씀해 주셨는데,
어떠한 방식으로 접근하면 좋을지 피드백 주시면 감사하겠습니다..!
넵! 쿼리 다시 작성해서 글 올리도록 하겠습니다!
마농 선생님, 여기에 질문 다시 작성했습니다!
SELECT fam.* 상태에서는 답변이 불가합니다.
조회 필요 항목을 명확하게 적어주셔야 합니다.
잘은 모르겠지만,
본인과 가족의 여권 정보를 원하는것 같네요.
SELECT FAM.me_client_id
, CASE WHEN C.client_id = FAM.me_client_id THEN 'ME' ELSE 'FAM' END
, C.client_id
, MAX(PASS.passport_id) AS passport_id
FROM family AS FAM -- 가족
INNER JOIN client AS C
ON C.client_id IN ( FAM.me_client_id -- 본인
, FAM.other_client_id) -- 상대방
LEFT OUTER JOIN passport AS PASS -- 여권
ON C.client_id = PASS.client_id
WHERE FAM.me_client_id = 1038
GROUP BY FAM.me_client_id
, CASE WHEN C.client_id = FAM.me_client_id THEN 'ME' ELSE 'FAM' END
, C.client_id
lionqueen 선배님 답변 감사드립니다!
네.. 본인, 가족의 여권 정보를 얻으려고 하는 것이 맞습니다.
QueryDSL을 이용하면 인라인 뷰 서브쿼리 등을 지원해주지 않는다고 해서 방법을 찾고 있었습니다..
구루비 방문할 때마다 커다란 걸 하나씩 배워가네요...
정말 감사드립니다! 좋은 하루 되세요 :)