Oracle) Project) UNION 사용 시 ORDER BY 정렬 방법

이지우·2022년 11월 28일
0
  • UNION 할 SELECT 쿼리에 ORDER BY절이 포함되어 있으면 에러 발생한다.

    https://h5bak.tistory.com/78

     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 정렬하지 않고 정렬용 컬럼만 추가 조회한 뒤, 메인 쿼리에서 정렬용 컬럼을 기준으로 먼저 정렬하고 그 뒤에 원하는 기준 컬럼을 작성

profile
IT개발 입문합니다.

0개의 댓글