환경
MSSQL, Mybatis 를 사용하고 있습니다.
개요
B 테이블에서
한 칼럼의 값을 기준으로 그룹을 지어
각 그룹별 가장 가장 최근 튜플들을 검색한 뷰를
테이블과 조인하려 합니다.
SQL 문을 어떻게 작성해야할까요?
상태
문제는 다음과 같습니다.
두 테이블이 있습니다.
- A
- B
두 테이블은 하나의 값을 공유하고 있습니다.
- A.id = B.id
A 테이블
- id에 대한 기본 정보를 다루고 있습니다.
- id컬럼은 테이블 내에서 중복되지 않는 유일한 값입니다.
B 테이블
- A에서 언급된 각 id의 변화에 대한 시점별 로그를 다루고 있습니다.
- id 컬럼은 테이블 내에서 중복되는 값입니다.
다음과 같은 결과를 Select 하려고 합니다.
select
cast(A.name_korean as varchar(1000)) as name_korean,
cast(A.name_english as varchar(1000)) as name_english,
A.data1 as data1,
A.data2 as data2,
A.id as id,
A.type as type,
(case
when (B.a = 'On' and B.b = 'On' and B.c = 'On' and B.d = 'On') then 'On'
else 'off'
end) as status
B 테이블에서
각 id의 가장 최근 튜플들을 검색하여
A 테이블과 조인하려 합니다.
아래는 제가 잘 알지 못하여 잘못된 문법으로 작성한 구문입니다.
from
A,
(select B.id, max(B.date) as date
from B
group by B.id) as B
기타
구글링을 통해 찾은 방법은
먼저 B 테이블을 내림차순으로 정렬 한 후 각 소그룹의 첫번째 행을 가져오는 것입니다.
하지만 이 방법은 데이터가 점점 늘어날수록
정렬이라는 오버헤드가 점점 무거워질것 같아서
다른 방법을 찾고 있습니다.