오리지널 북과 일반도서 두 2개는 별개의 테이블로 만들어져있지만 두 테이블을 합쳐서 조회수 3개만 출력하고싶었다.
우선 2개의 테이블을 합치는 것을 먼저하기로 했다.
select nor_book_no "nor_book_no", cover_rename, book_info,book_title,
'normal' as "category",'Y' as "BOOK_PERMISSION",view_count from normal_book
//여기까지는 일반도서 테이블
union all //합쳐주는 코드
select ori_book_no "nor_book_no", corver_rename "cover_rename",
book_info,book_title,'origin' as"category",BOOK_PERMISSION,
view_count from origin_book
//여기까지 오리지널 도서 테이블
where status like 'Y%' and BOOK_PERMISSION like 'Y%' //출력조건
order by view_count desc; //정렬조건
그래서 하나의 컬럼으로 출력하기 위해 두 컬럼의 이름을 같게 하기로 했다
nor_book_no "nor_book_no"
ori_book_no "nor_book_no"
컬럼이름을 이런식으로 적어주면 같은 "nor_book_no"로 인식하게 된다.
카테고리의 이름을 붙여주어 합쳐져도 오리지널과 일반도서의 구분이 가도록 해주었다.
'normal' as "category"
'origin' as"category"
오리지널 도서와 일반도서가 출력되는 조건이 다르다, 오리지널 도서는 관리자의 허가가 필요하며 일반도서는 삭제하지 않았으면 된다.
일반도서에는 관리자 허가 칼럼이 없기에 'Y' as "BOOK_PERMISSION"
으로 무조건 허가 컬럼이 Y로 출력되도록 하였다.
이렇게 컬럼명 "출력할컬럼명"을 이용하여 컬럼의 이름을 맞춰주면 2개의 테이블이 겹치는 컬럼이 없어도 서로 합쳐진다.
원하는 순위의 컬럼을 가져오는 법에 대해서는
여기에 자세하게 적었다.
이번에도 같은 방법을 썼다.
select * from( //select*from으로 from()의 괄호안에 합친 테이블을 넣어준다
select "nor_book_no", cover_rename,
book_info,book_title,"category","BOOK_PERMISSION",view_count,ROW_NUMBER()
over (order by view_count desc) r
from (select nor_book_no "nor_book_no", cover_rename,
book_info,book_title,'normal' as "category",'Y' as
"BOOK_PERMISSION",
view_count from normal_book
union all
select ori_book_no "nor_book_no", corver_rename "cover_rename",
book_info,book_title,'origin' as"category",BOOK_PERMISSION,
view_count from origin_book
where status like 'Y%' and BOOK_PERMISSION like 'Y%'))//여기에는 order by를 넣지 않았다.
where r between 1 and 3; //where 조건 between을 활용한다
select * from (row_number()로 연결해 만든테이블) where 내가붙인컬럼명 between 첫순위 and 마지막 순위
이다.ROW_NUMBER() over (정렬조건) 순위컬럼이름 from()
이다주의할 것은 반드시 내가 정렬하고자 하는 컬럼을 select절에 써주어야 하며 내가 원하는 조건의 컬럼도 똑같이 select절에 써주어야 정상출력된다는것이다
강의땐 중요하지 않게 생각한 쿼리문의 중요성을 많이 느끼고 있다.
배울때는 자주 쓸까? 싶었는데 의외로 쿼리문을 잘 만들어야 내가 원하는 값을 만들수 있다는 걸 알았다.