ROW_NUMBER 함수 질문입니다 0 8 505

by cheee [2017.02.24 15:30:54]



SELECT EMP.*,(ROW_NUMBER() OVER(ORDER BY EMPNO)) AS RN
FROM EMP
WHERE RN=4

WHERE 절 빼고 위 2줄 쿼리는 잘 작동하는데, RN이 1,2,3,4,.... 있으면 그중 4나 5만 보고 싶으면 어떻게 해야 하나요? 그리고 RN 을 WHERE에서 불러올 수 없는 이유는 뭘까요??

by jkson [2017.02.24 15:39:14]
SELECT *
FROM
(
SELECT EMP.*,ROW_NUMBER() OVER(ORDER BY EMPNO) AS RN
FROM EMP
)
WHERE RN=4

쿼리 실행순서는

from -> where -> group by -> having -> select -> order by 순으로 진행됩니다.

select 수행전인 where 절에서 select에서 만든 결과를 조건절로 걸어주니 오류가 나는 것이죠.


by cheee [2017.02.24 15:48:50]

와 감사합니다~


by cheee [2017.02.24 15:52:37]

혹시 여기서 RN 컬럼만 빼고 보고 싶다면 컬럼을 숨기는 명령어도 있나요? 

페이지 형식으로 뷰할려고 하는데 

 

SELECT *
FROM
(
SELECT EMP.*,ROW_NUMBER() OVER(ORDER BY EMPNO) AS RN 
FROM EMP
)
WHERE CEIL(RN/3) IN (2,4)

하고 나서 RN 컬럼을 안보이게 만들고 싶어요


by jkson [2017.02.24 16:01:54]

그렇다면

*가 아니라

출력할 emp 컬럼을 다 적으셔야합니다.


by cheee [2017.02.24 16:13:48]

아하! 그러네요 쉽게 생각할걸 HIDE 함수같은게 있나 고민했어요 ㅎㅎ  감사합니다


by 마농 [2017.02.24 17:34:52]

페이징 쿼리로 rn 을 사용할 목적이라면?
rn 을 가공하여 조건을 주면 비효율입니다. CEIL(RN/3)
rn 을 가공없이 그대로 조건을 주어야 효율적으로 동작합니다.


by cheee [2017.02.24 17:50:12]
SELECT EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO
FROM 
(SELECT EMP.*
, CEIL((ROW_NUMBER() OVER(ORDER BY EMPNO))/3) RN 
FROM EMP)
WHERE RN IN (2,4)

이렇게 말인가요? WHERE에 연산을 넣으면 안좋은건가봐요!

 


by 마농 [2017.02.24 18:10:12]

CEIL(RN/3) IN (2,4) 이 조건만 본다면? 의미 없는 답글일 수도 있는데요.
페이징 쿼리라는 관점에서 본다면?
CEIL(RN/3) = 2 이런식의 조건이어야 하지 않나 생각되구요.
이 조건은 필터 조건으로 풀리게 되는데.
RN BETWEEN 4 AND 6 으로 조건을 변경하면
pushed rank 또는 stop key 로 풀리게 됩니다.
 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입