인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

Inflearn Community Q&A

mulju's profile image
mulju

asked

[A hundred words are not as good as seeing once] Advanced SQL for data analysis

Solving LeetCode problems with unusual join conditions + Doing two or more self joins

리트코드 Consecutive Numbers 질문드립니다!

Written on

·

178

1

SELECT L.Id , L.num, L1.num

FROM Logs L inner JOIN LOGS L1

ON L.Id = L1.Id+1

------------------------------------

SELECT L.Id , L.num, L1.num

FROM Logs L inner JOIN LOGS L1

ON L.Id+1 = L1.Id

------------------------------------

비슷한 문제가 나올때마다 너무 헷갈리네요.... 두 쿼리의 차이점은 JOIN의 ON절에 사용하는 조인조건을 어떤테이블에 적용해야 하느냐 입니다.

ID와 ID+1한 것이 같다고 쓴 부분에 대해 생각해보면
두 경우 다 ID가 2부터 출력되어야 하는것 아닌가요?

값이 왜 다르게 나오는지 모르겠습니다. 어떻게 생각하면 좀 쉬울까요?

sql

Answer 1

0

sdatarian님의 프로필 이미지
sdatarian
Instructor

안녕하세요 함문주님, 답변 드립니다.

말씀해주신 것처럼 두 쿼리는 +1을 어느 테이블의 Id에 했는지만 다르고,
첫번째 쿼리는 Id가 2부터, 두번째 쿼리는 Id가 1부터 출력됩니다.

아시다시피 JOIN 한 결과에 따라 SELECT 절에 있는 컬럼들이 출력됩니다.
첫번째 쿼리는 L1의 Id에 +1을 하여 L의 Id와 JOIN하고, L의 Id를 출력합니다.
반면 두번째 쿼리는 이와 반대로 L의 Id에 +1을 하여 L1의 Id와 JOIN했지만 똑같이 L의 Id를 출력합니다.
혹시 문제점을 아시겠나요?

두번째 쿼리에서 Id가 2부터 출력되게 하려면 L.Id가 아닌  L1.Id를 출력해야 합니다.
L.Id +1 이 L1.Id와 같으므로 L.Id가 1일때 L2.Id 는 2, L.Id가 2일때 L2.Id는 3이 출력됩니다.
따라서 지금처럼 L.Id를 출력하면 값이 1부터 나오게되고, L1.Id를 출력해야 원하시는 대로 2부터 결과가 나옵니다.

답변이 도움이 되셨길 바랍니다 :)

mulju's profile image
mulju

asked

Ask a question