SELECT A.* FROM tbl_a A
LEFT JOIN tbl_b B ON A.name=B.name
WHERE A.name='홍길동'
ORDER BY A.date DESC
위의 쿼리에서 '홍길동'에 해당하는 값이 tbl_b에 있는데(unique할때)
tbl_b에 있는 name만큼
tbl_a의 모든 값을 select 하고자 합니다.
도움 부탁드립니다.
감사합니다.
※ 질문 정보가 부족했습니다.
위와 같이 할 경우
홍길동, ...
홍길동, ...
홍길동, ...
차선생, ...
차선생, ...
고길동, ...
고길동, ...
와 같이 출력될 때 원하는 결과는 각 이름의 가장 최근 정보만 하나씩만 나오게 하는 것입니다.
홍길동, ...
차선생, ...
고길동, ...
감사합니다.
그냥 이름 조건 없이 Inner 조인하면 될듯요.
SELECT A.* FROM tbl_a A
inner JOIN tbl_b B ON A.name=B.name
ORDER BY A.date DESC
질문 정보가 부족했습니다. 위에 내용 추가했습니다. 감사합니다.
프로그램 소스 코드에서 for문으로 tbl_b의 name을 가져와서 아래와 같이 하는 방법 밖에는 없는 것일까요? 쿼리만으로 해법이 없을까요?
SELECT A.* FROM tbl_a A
LEFT JOIN tbl_b B ON A.name=B.name
WHERE A.name=#{name}
ORDER BY A.date DESC LIMIT 1
with ta as (
select '홍길동' as name , '서울' as addr , 24 as age , sysdate -2 as date1 from dual union all
select '홍길동' as name , '서울' as addr , 24 as age , sysdate -3 as date1 from dual union all
select '차선생' as name , '서울' as addr , 24 as age , sysdate -1 as date1 from dual union all
select '차선생' as name , '서울' as addr , 24 as age , sysdate -4 as date1 from dual union all
select '고길동' as name , '서울' as addr , 24 as age , sysdate -5 as date1 from dual union all
select '고길동' as name , '서울' as addr , 24 as age , sysdate -2 as date1 from dual
) , tb as (
select '홍길동' as name from dual union all
select '차선생' from dual union all
select '고길동' from dual
)
select *
from (
select ta.* , row_number() over ( partition by ta.name order by ta.date1 desc) as rn
from ta inner join tb on ta.name = tb.name
) tt where tt.rn=1
최근 정보를 가져오려면 순서를 알 수 있는 컬럼 정보(순번이나, 일시 등)가 필요합니다.
그걸 이용해 row_number 를 사용해 푸시면 됩니다. 위 댓글 참조
그리고, 조인이 필요한 것인지도 고민해 보시길 바랍니다. 조인이 필요 없을 수도 있습니다.
답변 주신분들 대단히 감사합니다.