본문 바로가기
  • 읽고보고쓰고
PROGRAMMING/Database

공통테이블과 조인

by 체리그루브 2018. 5. 5.
728x90

다양한 로직 구현을 한 번의 쿼리로 끝낼 수 있는가는 쿼리를 다루는 사람들에게 있어서는 일종의 장인정신에 가까운 영역이다. 물론 속도 최적화를 위한 고도의 영역과는 별개라고 생각한다. 거기는 내가 아직 도달하지 못한 영역이라 자신 할 수 없다.

 

최근에 with cte as 로 시작하는 공통 테이블 쿼리를 다루고 부터는 이같은 한방쿼리가 남의 얘기만은 아니게 됐다. 더군다나 중복된 쿼리에 대해서는 partition 을 활용해 카운트 별로 처리 할 수 있고, 관계대수 논리에 맞춰 연이어 cte를 붙여 나갈 수 있다. 이런 한방 쿼리는 어려운 퍼즐을 푸는 것과 같아서 큰 성취감도 더해준다.

 

한번은 같은코드에 서로 다른 연번이 붙은 기준 정보를 변경하는 업무가 주어졌다. 내가 해결해야 모두 퇴근할 수 있는 퇴근미션이었던 셈이다. 한 코드가 2개이상인 데이터. 다행히 pk는 있었고 번호가 작은 데이터의 특정 컬럼 값을 해당 코드의 가장 큰 번호의 컬럼에 업데이트 하는 문제였다. 우선 머리를 스쳐간 생각은 좌측 칼럼엔 as_is 으로 이른 번호값을 넣고, 우측 칼럼엔 to_be를 만들어, 직관적으로 비교 가능하게 하자는 것. 그래서 무작정 공통테이블을 활용하기 시작했다. 첫문장은 having을 활용한 중복 추출. 두번째는 이를 바탕을 중복번호를 partition by로 추출. 이렇게 하면 코드 마다, 순서가 내려진다. 즉 1, 2가 각 코드별로 반복해서 펼쳐지는 경험을 하게된다. 세번째부터가 고민이 많았는데, 바로 2개 이상인 코드를 어떻게 할 것인가 하는 것인데, 이런 경우에는 전체 목록을 펼쳐 놓고 일종의 패턴을 파악하는 게 중요하다. 3개가 넘는 코드는 그만한 이유가 있었다. 패턴을 찾아낸 이후로는 이전번호 이후번를 각각 얻기 위한 조건절을 먹인 cte를 각각 만들고 이 두 뷰를 조인 건다.

728x90

댓글