홍팥
60
2017-07-17 17:32:53.0
7
190

db 쿼리인데 더 효율적인 쿼리 가능할까요?


회사에서 사용하는 쿼리가 비효율적인 나쁜 쿼리로 보여서 이걸 간단히 바꿀 수 있을까요?


나쁜 쿼리라는건 순전히 제 생각입니다. 뭔가 깔끔한 쿼리처럼 보이질 않아서요


아래는 비슷하면서 간단한 예제로 바꿔봤어요


테이블명 : usr_info

usr_idusr_lvusr_addrusr_nameusr_tel
kim1서울시 관악구홍길동010-1111-2222
kim2서울시 관악구홍길동1010-1111-2224
kim3서울시 강남구홍길동2010-1111-2224
min1제주시 서귀포심청이010-8888-9999
min2제주시 서귀포12심청이010-9999-9999


이런 데이터가 있을 때 usr_id 와 usr_lv 로 그룹을 잡아서 usr_lv 가 가장 높은 정보만 뽑아내야합니다


노란색으로 색칠한 정보만 검색되게끔요



아래는 사용중인 쿼리 모양입니다


select * 
from usr_info a
inner join (
  select usr_id, max(usr_lv) as usr_lv
  from  usr_info
  group by usr_id
  ) b
on (a.usr_id = b.usr_id and a.usr_lv = b.usr_lv);


이렇게 쿼리 날리면 원하는대로 나오기는 하는데 쿼리가 좀 허접스러워보여요


더 좋은 방법 없을까요?

0
0
  • 답변 7

  • byeworld
    2k
    2017-07-17 17:38:41.0

    윈도우 함수(혹은 분석함수) 사용하시면 좀 더 빠릅니다.

    0
  • vernum
    356
    2017-07-17 17:39:11.0

    오라클인가요?

    0
  • 홍팥
    60
    2017-07-17 19:08:18.0

    오라클입니다

    or 은 어느부분에 쓰라고하시는 건가요?

    분석함수는 뭔지 몰라서 좀 찾아봐야겠네요

    0
  • jhyoon
    608
    2017-07-17 23:45:42.0

    저는 요렇게 할거 같아요

    SELECT usr_id, 
           MAX(usr_lv) AS usr_lv,
           usr_addr,
           usr_name,
           usr_tel
    FROM usr_info
    GROUP BY usr_id;


    0
  • 홍팥
    60
    2017-07-18 09:20:33.0

    jhyoon 님

    알려주신 쿼리는 usr_addr, usr_name, usr_tel 의 데이터가 모두 동일하면 상관없는데

    usr_lv 별로 달라서 원하는 결과가 안나오네요

    0
  • mecca0515
    3
    2017-07-18 09:28:57.0
    select * 
      from (
      select 
          usr_id
          , usr_addr
          , usr_name
          , usr_tel
          , ROW_NUMBER() OVER (PARTITION BY usr_id ORDER BY usr_lv DESC) AS RN    --분석용함수
        from usr_info
    ) a
     where a.rn = 1
    
    
    현재 사용하시는 방법도 많이 사용하는 방법입니다. 허접한게 아니에요~
    0
  • 홍팥
    60
    2017-07-19 09:14:22.0

    mecca0515  님

    알려주신건 몰랐던 방법이네요

    알려주신게 쿼리도 더 깔끔하고 좋아보여요

    감사합니다


    근데 제가 한게 허접하지 않다니 그나마 기분 좋네요

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.