조인을 하는데 해결이 잘 안되어서 질문 드려요...ㅠㅠ 0 8 1,327

by kshap [2015.01.22 13:53:45]


안녕하세요

조인을 하는데 해결이 안되네요..

 

예를 들어서

학생테이블(학번(pk), 이름)

게시판테이블(게시글번호(pk), 학번, 게시글등록날짜, 게시글내용)

 

이렇게 두 테이블이 있다고 할때 한 학생이 게시판에 글을 여러번 남길 수 있고

게시글을 남길때마다 게시판 테이블에 행이 하나씩 추가됩니다.

 

이런상황에서 '모든 학생에 대해 각각의 학생들이 마지막으로 글을 남긴 날짜'만 빼오고 싶습니다

조건으로 특정 기간을 주어서 이 기간동안 게시글을 남긴 학생의 최종 게시 날짜

또 반대로 특정 기간동안 게시글을 남기지 않은 학생리스트

이렇게 결과를 출력해야합니다.

조인을 하면 게시글을 여러번 남긴학생의 경우 한 학생마다 여러행이 생기게 되고..

학번을 distinct 해봤는데 그래도 여러행으로 나오게 되네요.....

 

조언부탁드립니다ㅠㅠ

by jkson [2015.01.22 13:59:22]

쿼리문을 올려주시지.. ㅠ

select a.학번, a.이름, max(b.게시글등록날짜)

from 학생테이블 a, 게시판테이블 b

where a.학번 = b.학번

and b.게시글등록날짜 between '시작일자' and '종료일자'

group by a.학번, a.이름

 

select a.학번, a.이름

from 학생테이블 a

where not exists (select 1

from 게시판테이블 b

where b.게시글등록날짜 between '시작일자' and '종료일자'

and b.학번 = a.학번)


by kshap [2015.01.22 14:34:58]

그룹함수를 쓰는 방법이 있었군요.....

생각도 못했네요....

감사합니다!!


by kshap [2015.01.22 21:58:42]

근데 혹시 아래 쿼리에도 select에 게시글등록날짜를 포함하려면 어떻게 써줘야 하나요....?


by 마농 [2015.01.23 14:36:20]

아래 쿼리는 일자가 없는 자료를 조회하는 쿼리인데...

비어있는 일자는 뭐하러 포함시켜요?


by kshap [2015.01.23 18:22:49]

일자가 아에 없는 자료가 아니라

일자는 있지만 특정일자 안에 포함 안되는 자료이기 때문에

마지막으로 글을 남긴 날짜가 필요합니다


by jkson [2015.01.24 12:03:14]

select a.학번, a.이름, max(c.게시글등록날짜)

from 학생테이블 a, 게시판테이블 c

where not exists (select 1

from 게시판테이블 b

where b.게시글등록날짜 between '시작일자' and '종료일자'

and b.학번 = a.학번)

and a.학번 = c.학번

group by a.학번. a.이름


by lovekod2hj [2015.01.22 14:09:50]

windows 함수를 이용하시면 될 거 같습니다.
 

with tmp_a as
 (select '000001' as 학번, '홍길동' as 이름 from dual union all
  select '000002' as 학번, '전우치' as 이름 from dual
  ),
  tmp_b as
  (select 1 as 게시글번호, '000001' as 학번, '20150120' as 게시글등록날짜, '내용1' as 내용 from dual union all
   select 2 as 게시글번호, '000001' as 학번, '20150121' as 게시글등록날짜, '내용2' as 내용 from dual union all
   select 3 as 게시글번호, '000002' as 학번, '20150121' as 게시글등록날짜, '내용3' as 내용 from dual union all
   select 4 as 게시글번호, '000001' as 학번, '20150122' as 게시글등록날짜, '내용4' as 내용 from dual union all
   select 5 as 게시글번호, '000002' as 학번, '20150122' as 게시글등록날짜, '내용5' as 내용 from dual )
select *
from (   
select a.학번
     , a.이름
     , b.게시글등록날짜
     , row_number() over (partition by a.학번 order by b.게시글등록날짜 desc) as rnum
  from tmp_a a
     , tmp_b b
 where a.학번 = b.학번(+)
)
where rnum = 1

 


by kshap [2015.01.22 14:35:40]

윈도우 함수는 아직 공부를 못해봤어서

당장 공부해봐야겠네요

감사합니다!!

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