MSSQL 조인 방법. 0 4 800

by 한번사는인생 [SQLServer] [2022.03.14 09:26:54]


A B C D 라는 테이블이 있습니다.

A B 를 LEFT OUTER JOIN으로 가져옵니다.

A와 B는 테이블은 1:1 구조라 OUTER JOIN 하는데 문제는 없습니다.

이때 B와 C구조는 1:N입니다.

B와 C 테이블을 조인할 경우, 테이블 C에서 이름이 가장 빠른 녀석 1개만 가져오려고 하는데

C 테이블을 PARTION BY 를 이용해서 RANK 값이 1인 값만 가져와서 조인을 했습니다.

 

더 좋은 방법을 생각해보고 있는데, 잘 떠오르지 않아서 질문 남겨봅니다.

by 마농 [2022.03.14 12:36:09]

1. 순위함수는
- 중복 허용인 rank 보다는
- 유일한 row_number 가 의미상 맞습니다.
2. a 에 대한 검색 조건이 있다면?
- 조인 후에 row_number 하는 게 좋습니다.
- 필요한 자료만 조인하는 효과
3. a 에 대한 검색 조건이 없다면?
- row_number 후에 조인 하는 게 좋을 수도 있습니다.
- 조인 대상을 줄이는 효과
4. 단순 이름 하나만 가져오는 거라면?
- row_number 가 아닌 min 을 이용하여 구할 수도 있습니다.
5.조인시 주의사항
- b 를 아우터 조인했다면?
- b 에 연결되는 c 도 순차적으로 아우터 조인해야 합니다.


by 한번사는인생 [2022.03.14 13:09:56]

말씀하신 것을 요약한다면,

SELECT *

FROM A WITH (NOLOCK)

LEFT OUTER JOIN B WITH (NOLOCK)

A.KEY = B.KEY

LEFT OUTER JOIN C WITH (NOLOCK)

B.KEY = C.KEY

 

(2번)A에 대한 조건이 있다면

C 테이블을 따로 ROW_NUMBER하는게 아니라,

위 테이블 전체를 ROW_NUMBER하라는 말씀이신가요?

 

(3번)은 C 테이블을 따로 ROW_NUMBER하고 난 다음 A/B를 조인한 것을 조인하라는 말씀이 맞는건가요?

 

 

주의사항까지 꼼꼼하게 알려주셔서 고맙습니다.

 


by 마농 [2022.03.14 13:17:54]

예를 들어 A 가 100만건이고, C 가 1000 만건 이라고 하면 (대략 1:10 정도라고 가정했을 때)
그중 조건을 줘서 A 의 100 건만 뽑는다고 했을 때를 가정하고 생각해 보시면 됩니다.
전체 100만건 추출이라면? 1000만건을 일단 100만건으로 줄여서 1:1 조인하는게 좋을 듯 하고
일부 100건만 추출한다면? 1000건만 조인하면 되니 조인 먼저 하는게 유리하고.


by 한번사는인생 [2022.03.14 13:26:38]

항상 좋은 의견 및 조언 고맙습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입