강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

강현희님의 프로필 이미지
강현희

작성한 질문수

SQL Server 컨설턴트가 알려주는, 쿼리 능력 레벨업(고급 T-SQL 쿼리)

join관련 질문드립니다

해결된 질문

작성

·

53

0

강사님, 안녕하세요. sql join질문이 있습니다.

제가 이전의 업무에서는 테이블의 물리적 fk도 맺어져있고 DB에 들어오는 값도 화면에서 정제된 값이 들어왔습니다. 업무 복잡성도 지금 보다는 낮아서 left outer join을 여러개 사용하거나 correlated 쿼리나 CTE를 사용할 일이 없었습니다.

지금은 상황이 180도 바뀌어서 급히 강사님 강의를 들으며 공부하고 있는데요.

그래서 제 질문이 너무 쉬운거라도 이해 부탁드립니다.

 

먼저 아래 sql을 첫번째 join부터 마지막 join을 하나씩 붙여가며 데이터를 확인했고 개발하신분이 의도한바는 어느정도 이해한 상태입니다.

 

DB는 DB2를 사용하고있습니다

 

질문1) alias aa와 bb가 "이너조인이 된 후" 이너조인된 값을 기준으로 cc -> gg -> tt 순서대로 left outer join 이 되고있습니다.

└ from절에 있는 aa,bb를 where절 조건을 보고 DB가 이너조인이네? 하고 판단하는거 같습니다.

sql 실행순서가 from절 → where절로 이해하고 있는데 where절의 aa.family_cust_no= bb.cust_no를 본 후 다시 from절로 와서 이너조인을 진행하는건지요

└ sql실행순서대로 생각해보면 aa, bb는 cross join이 되고나서 마지막에 where aa.family_cust_no= bb.cust_no로 결과값이 필터링 되어야 할거 같은데

dbeaver툴의 plan결과를 보면 inner join부터 시작하고 있었습니다. 이렇게 사용해도 무방한건지 아니면 이 방법이 일종의 꼼수인데 가능한 건지요

 

└ 아니면 inner join, left outer join 섞이는게 가능한데 제가 그걸 모르고 있는건지 헷갈립니다.

 

질문2) tt의 경우 aa와 bb 둘다 on 조건이 추가되어 있습니다.

└ aa, bb가 이너조인을 통해 하나의 결과값 덩어리로 만들어져 있어서 tt를 aa와 bb의 컬럼으로 on 조건을 추가한거 같은데 이렇게 많이 사용하시나요. 아니면 이것도 일종의 꼼수 같은 것인지요

감사합니다.

======================================================

select

aa.family_emp_no

,aa.family_cust_no

,aa.cust_name

,bb.cust_regi_no

,cc.cust_grd_cd

,tt.regist_date

,o.tmt_agre_yn as rcm1

,p.tmt_agre_yn as rcm1

,qq.credit_info_use_agre_yn

.qq.sms_agree_yn

from family_cust_master aa

, table ( select cust_regi_no

,cust_no

,ocpt_cd

from cust_master) bb

left outer join cust_type_grad_info cc

on aa.family_cust_no = cc.cust_no

and cc.cust_grad_type ='A09'

left outer join family_cust_marketing_hist_info gg

on aa.family_emp_no = gg.family_emp_no

and aa.cust_no = gg.cust_no

left outer join family_cust_persnal_agre_info tt

on aa.family_emp_no = tt.family_emp_no

and bb.cust_no = tt.cust_no

and tt.last_yn='Y'

and tt.agre_type = 'A'

, table(

select tmt_agre_yn

from family_cust_master 01

left outer join family_cust_ch_agre_info 02

on 01.family_emp_no = 02.family_emp_no

and 01.family_cust_no = 02.family_cust_no

and 02.ch_code ='A1'

where aa.family_emp_no = 01.family_emp_no

and aa.family_cust_no = 01.family_cust_no

order by 02.agre_start_date desc

fetch first 1 rows only

) o

,table (

select p2.tmt_agre_yn

from family_cust_master p1

left outer join family_cust_ch_agre_info p2

on p1.family_emp_no = p2.family_emp_no

and p1.family_cust_no = p2.family_cust_no

and p2.ch_code ='A1'

where aa.family_emp_no = p1.family_emp_no

and aa.family_cust_no = p1.family_cust_no

order by p2.agre_start_date desc

fetch first 1 rows only

) p

left outer join table (

select ll.credit_info_use_agre_yn

,ll.sms_agree_yn

from credit_info_use_agre_yn ll

where aa.family_cust_no = ll.cust_no

and ll.agre_end_date > '2025-01-01'

fetch first 1 rows only

) qq

on 1=1

where aa.family_cust_no= bb.cust_no

and aa.family_emp_no = '0000000001'

and aa.family_cust_type = '001'

and aa.delete_cust_yn ='N'

 

답변 1

0

김정선SQL님의 프로필 이미지
김정선SQL
지식공유자

안녕하세요 강현희님,

우선 송구하게도 DB2는 제가 사용 경험이 없습니다. 해서 보여주신 구문을 정확히 이해하지 못하고 그에 더해 업무 로직도 알지 못하기 때문에 어떤 문제가 있고 어떻게 할 수 있는지 정확한 답을 드리지는 못하는 점 양해 바랍니다.
다만 위와 무관하게 일반적인 SQL 문으로서 보이는 몇 가지 제 의견을 드리니 참고하시고 작으나마 도움이 되셨으면 합니다.

 

  • 많이 혼란스러워 보이는 SQL 문이네요. 다시 작성한다면 더 간결하게 작성할 수도 있어 보입니다.

  • INNER JOIN과 OUTER JOIN은 업무 로직에 따라 다양하게 조합해서 사용할 수 있습니다.

  • SQL문은 쿼리의 "논리적인" 순서를 정의합니다, 실제 "물리적인" 순서는 DB 엔진 내부 Query Optimizer에 의해서 정해지고 처리됩니다. 말씀하신 실행 계획을 통해서 보여지는 것이 그 순서입니다.

  • 일반적으로 ON 1 = 1 형식은 일명 CROSS JOIN이라고 부르는 형태로 처리하고 싶으나 해당 문법을 지원하지 않을 때 사용되는 방법 중에 하나입니다 (제 기억이 맞다면^^), 위 코드도 그런 의도인지는 확인해 보셔야겠습니다.

이상입니다.

강현희님의 프로필 이미지
강현희

작성한 질문수

질문하기