작성
·
254
0
처음에 N+1을 해결하시기전에 tag만 leftjoin으로 보여주시고 중복되는 row를 보여주시는 부분에서 질문이있습니다.
해당 sql문이 동작하는 방식이 아래인것같은데
where문이 먼저 study중 jpa가 들어간 study만 조회해온다.
후에 해당 study 에 연관된 애들만 fetch join해서 가져온다.
궁금한것은 왜
join먼저 되고 where문이 걸러주지 방식으로 동작하지 않는건가요..? 원래 이 방식이 sql 문에 join 과 where을 같이 썼을때 동작하는 방식이 아닌가요..?
답변 3
0
0
데이터는 이 수업에서도 where 절이 걸러준거에요.
테이블이 세개여서 조금 복잡한데요. 스터디, 스터디_태그, 태그 이렇게 세개인데 이 세개를 왼쪽 기준으로 합치는 쿼리를 만들었죠. 왼쪽 조인이니까 where 조건 (jpa 태그를 가지고 있거나 스터디 타이틀에 jpa가 있는 데이터)으로 걸러낸 데이터를 왼쪽 테이블 들 (스터디와 스터디_태그) 기준으로 출력하는 과정에서 세줄이 되었고 그 중에 한 줄에 spring 태그가 들어간 겁니다.
좀 더 자세히 설명드리자면, 태그 기준으로 보면 1개의 데이터(jpa 태그)를 찾았는데 그 한 데이터는 2개의 스터디_태그와 연결되어 있습니다. 그리고 다시 그 두개의 스터디_태그는 2개의 스터디와 연결이 되죠.
자 그럼 이제 합쳐서 출력해야 하는데 왼쪽 기준이니까 스터디 데이터 2개, 해당 스터디가 가지고 있는 스터디_태그 데이터가 3개 (여기서 세줄이 됩니다) 그리고 각각의 스터디_태그에 연결되어 있는 태그들을 출력합니다.
첫번째 줄은 1번 스터디의 1번 스터디_태그에 연결된 1번 태그 (spring).
두번째 줄은 1번 스터디의 2번 스터디_태그에 연결된 2번 태그 (jpa)
세번째 줄은 1번 스터디의 3번 스터디_태그에 연결된 2번 태그 (jpa)
첫번쨰 줄을 보고 where절이 적용 안된거 아니냐고 생각하시는 것 같은데요. 적용이 되었기 때문에 나온겁니다. jpa 태그나 타이블에 jpa가 없는 스터디를 만들어서 테스트 해보시면 해당 데이터가 걸려져서 아에 출력이 안되는걸 볼 수 있을 겁니다.
0
https://stackoverflow.com/questions/354070/sql-join-where-clause-vs-on-clause
위 링크의 2번째 답변을 보고 궁금증이 생겨서 여쭤봤습니다.
해당 답변에서 where가 강의의 쿼리처럼 뒤에 존재하는데
처음에 leftjoin 결과를 보여주고 where 문 때문에 중복이 걸러지는 것을 보여줍니다.
왜 강의에서 where는 jpa 태그만 가진 study만을 보여주지 않는지 궁금했습니다.