UNION 할 SELECT 쿼리에 ORDER BY절이 포함되어 있으면 에러 발생한다.
SELECT * FROM
(
SELECT NO, NAME, TEL, ADDR FROM A_TABLE A
UNION
SELECT NO, NAME, TEL, ADDR FROM B_TABLE B
)
ORDER BY A.NO, B.NO;
와 같이 UNION 쿼리를 인라인뷰로 하고, 각 SELECT절에 ALIAS 지정해 각 테이블의 컬럼들을 기준으로 정렬하면 된다....
고 하는데 나는 왜인지 안되서 다른 방법을 찾아보았다..
정렬을 위한 컬럼 추가해 메인쿼리에서 정렬하는 방법
https://stackoverflow.com/questions/6036793/sql-how-to-use-union-and-order-by-a-specific-select
select * from
(
SELECT id, 2 as ordered FROM a -- returns 1,4,2,3
UNION
SELECT id, 1 as ordered FROM b -- returns 2,1
)
order by ordered
정렬용 컬럼을 하나 추가해 같은 이름으로 ALIAS 지정하고 메인쿼리 ORDER BY절에서 최우선 기준으로 정렬한다.
개인 프로젝트 예제)
검색 시 영화명, 감독명, 출연 배우명 순으로 검색 결과를 출력하고, UNION할 각 쿼리는 movie 테이블의 updateDate 컬럼을 기준으로 우선 정렬하고자 했다.
-> 검색 페이지에서 더보기 버튼이나 무한 스크롤 등을 통해 추가적으로 검색 결과 리스트를 append해 나갈 것이기 때문에 ORDER BY절 작성 필수. 언제나 똑같은 순서로 출력되어야한다.
SELECT iv.*
FROM (
SELECT 1 AS ordered, m_mn.updateDate, m_mn.movieCd, m_mn.movieNm, m_mn.prdtYear, m_mn.repGenreNm, m_mn.repNationNm, m_mn.directorDetail, m_mn.posterUrl
FROM tbl_movie m_mn
WHERE REPLACE(LOWER(m_mn.movieNm),' ','') LIKE REPLACE('%병헌%',' ','')
OR REPLACE(LOWER(m_mn.movieNmEn),' ','') LIKE REPLACE('%병헌%',' ','')
-- ORDER BY m_mn.updateDate DESC
UNION
SELECT 2 AS ordered, m_d.updateDate, m_d.movieCd, m_d.movieNm, m_d.prdtYear, m_d.repGenreNm, m_d.repNationNm, m_d.directorDetail, m_d.posterUrl
FROM tbl_movie m_d
WHERE REPLACE(LOWER(m_d.directorDetail),' ','') LIKE REPLACE('%병헌%',' ','')
-- ORDER BY m_d.updateDate DESC
UNION
SELECT 3 AS ordered, m_a.updateDate, m_a.movieCd, m_a.movieNm, m_a.prdtYear, m_a.repGenreNm, m_a.repNationNm, m_a.directorDetail, m_a.posterUrl
FROM tbl_movie m_a
WHERE REGEXP_REPLACE(m_a.actorDetail||',' ,'\|.*?\,', ',') LIKE REPLACE('%병헌%',' ','')
/* REPACE 함수와 REGEXP_REPACE 함수 다르다. / 와일드카드 % 사용 불가 */
/* 정규표현식: 특수문자쓰고싶으면 앞에 \ 붙여야함, \ : OR, .* : 모든문자, ?:0또는 1회 포함
-> 배우명|영문명|역할, 배우명||역할, 배우명|영문명|, 배우명|, 모두 커버 */
-- ORDER BY m_a.updateDate DESC
) iv
ORDER BY iv.ordered ASC, iv.updateDate DESC
=> 인라인뷰의 UNION한 각 쿼리는 별도로 ORDER BY 정렬하지 않고 정렬용 컬럼만 추가 조회한 뒤, 메인 쿼리에서 정렬용 컬럼을 기준으로 먼저 정렬하고 그 뒤에 원하는 기준 컬럼을 작성