오 테이블 조인 대박 신기함 2월에 SQLD 공부할 때는 느낌만 알 것 같은 그런 상태였는데 역시 백문이불여일견
상세
최소한의 컬럼만으로 구성
외래키 조건 설정: on delete cascade
컬럼명에 comment대신 reply를 사용함
create sequence reply_seq;
create table reply(
reply_no number primary key,
reply_writer varchar2(20)
references member(member_id) on delete set null,
reply_origin number
references board(board_no) on delete cascade,
reply_writetime date default sysdate not null,
reply_updatetime date,
reply_content varchar2(3000) not null
);
<input type="hidden" name="replyOrigin" value="${dto.boardNo}">
RequestParam
권장상태 컬럼
추가alter table reply add reply_blind char(1) check(reply_blind='Y')
private boolean replyBlind; //자바에서는 boolean으로 선언
replyDto.setReplyBlind(rs.getString("reply_blind")!=null);
//char를 boolean으로 받기 때문에
default는 지정하지 않으면 null이기 때문에 insert 구문에 문제 없음
삼항 연산
: boolean을 DB에 그대로 넣을 수 없으니 converter 만들어야 함@Override
public boolean updateBlind(int replyNo, boolean blind) {
String sql = "update reply "
+ "set reply_blind = ? "
+ "where reply_no = ?";
String replyBlind = blind ? "Y" : null;
Object[] param = {replyBlind, replyNo};
return jdbcTemplate.update(sql, param) > 0;
}
<a href="reply/blind?replyNo=${replyDto.replyNo}&replyOrigin=${replyDto.replyOrigin}">
@GetMapping("/reply/blind")
public String replyBlind(@RequestParam int replyNo,
@RequestParam int replyOrigin,
RedirectAttributes attr) {
ReplyDto replyDto = replyDao.selectOne(replyNo);
replyDao.updateBlind(replyNo, !replyDto.isReplyBlind());
attr.addAttribute("boardNo", replyOrigin);
return "redirect:/board/detail";
}
강사님이 inner join은 커플 조회, outer join은 솔로 조회라고 쉽게 예를 들어주셨는데 빡 와닿아서 그 느낌을 계속 가져가고 있음 ㅋㅋㅋ
select
R.*,
M.member_nick, M.member_grade
from reply R left outer join member M on R.reply_writer=M.member_id;
조회할 컬럼을 지정
해야 함select
B.board_no, B.board_head,
B.board_title, B.board_content,
B.board_writer, B.board_writetime, B.board_read,
B.board_like, B.board_group,
B.board_parent, B.board_depth,
count(R.reply_no) reply_count
from board B
left outer join reply R
on B.board_no=R.reply_origin
group by
B.board_no, B.board_head,
B.board_title, B.board_content,
B.board_writer, B.board_writetime,
B.board_read, B.board_like,
B.board_group, B.board_parent, B.board_depth
order by B.board_no desc;
select distinct
B.*,
count(R.reply_no)
over(partition by B.board_no) reply_count
from board B
left outer join reply R
on B.board_no = R.reply_origin;