[sql] Where 절의 SQL Row_Number () 함수

Row_Number()where 절의 함수로 답한 질문이 하나 있습니다. 하나의 쿼리를 시도했을 때 다음 오류가 발생했습니다.

“Msg 4108, 수준 15, 상태 1, 줄 1 창 함수는 SELECT 또는 ORDER BY 절에만 나타날 수 있습니다.”

내가 시도한 쿼리는 다음과 같습니다. 이 문제를 해결하는 방법을 아는 사람이 있으면 알려주세요.

SELECT employee_id
FROM V_EMPLOYEE
WHERE row_number() OVER ( ORDER BY employee_id ) > 0
ORDER BY Employee_ID



답변

이 문제를 해결하려면 CTE에 select 문을 래핑 한 다음 CTE에 대해 쿼리하고 where 절에서 창 함수의 결과를 사용할 수 있습니다.

WITH MyCte AS
(
    select   employee_id,
             RowNum = row_number() OVER ( order by employee_id )
    from     V_EMPLOYEE
    ORDER BY Employee_ID
)
SELECT  employee_id
FROM    MyCte
WHERE   RowNum > 0


답변

SELECT  employee_id
FROM    (
        SELECT  employee_id, ROW_NUMBER() OVER (ORDER BY employee_id) AS rn
        FROM    V_EMPLOYEE
        ) q
WHERE   rn > 0
ORDER BY
        Employee_ID

이 필터는 중복 ROW_NUMBER()됩니다.에서 시작 1하고 항상보다 큽니다 0.


답변

Select * from
(
    Select ROW_NUMBER() OVER ( order by Id) as 'Row_Number', *
    from tbl_Contact_Us
) as tbl
Where tbl.Row_Number = 5


답변

나는 당신이 다음과 같은 것을 원한다고 생각합니다.

SELECT employee_id
FROM  (SELECT employee_id, row_number()
       OVER (order by employee_id) AS 'rownumber'
       FROM V_EMPLOYEE) TableExpressionsMustHaveAnAliasForDumbReasons
WHERE rownumber > 0


답변

rexem의 답변에 대한 의견에 대한 응답으로 인라인 뷰 또는 CTE가 더 빠를 지 여부와 관련하여 쿼리를 다시 캐스팅하여 테이블 I 및 모든 사람이 사용할 수있는 sys.objects를 사용했습니다.

WITH object_rows AS (
    SELECT object_id,
        ROW_NUMBER() OVER ( ORDER BY object_id) RN
    FROM sys.objects)
SELECT object_id
FROM object_rows
WHERE RN > 1

SELECT object_id
FROM (SELECT object_id,
        ROW_NUMBER() OVER ( ORDER BY object_id) RN
    FROM sys.objects) T
WHERE RN > 1

생성 된 쿼리 계획은 정확히 동일했습니다. 나는 모든 경우에 쿼리 최적화 프로그램이 최소한 CTE를 인라인보기로 간단히 교체하거나 그 반대의 경우 동일한 계획을 제시 할 것이라고 예상합니다.

물론, 자신의 시스템에서 자신의 쿼리를 시도하여 차이가 있는지 확인하십시오.

또한 row_number()where 절은 Stack Overflow에 주어진 답변의 일반적인 오류입니다. Logicaly row_number()는 select 절이 처리 될 때까지 사용할 수 없습니다. 사람들은 그것을 잊고 답을 시험하지 않고 답할 때 때로 답이 틀립니다. (내가 죄를 지은 혐의.)


답변

나는 CTE 또는 Sub Query의 사용을 보여주는 모든 답변이 이것에 대한 충분한 수정이라고 생각하지만 OP에 문제가있는 이유에 대해 아무도 이해하지 못합니다. OP 제안이 작동하지 않는 이유는 다음과 같은 논리 쿼리 처리 순서 때문입니다.

  1. 에서
  2. 의 위에
  3. 붙다
  4. 어디
  5. 그룹화
  6. CUBE / ROLLUP 포함
  7. HAVING
  8. 고르다
  9. 뚜렷한
  10. 주문
  11. 상단
  12. 오프셋 / 패치

나는 이것이 이와 같은 문제가 발생하는 이유를 설명하기 때문에 대답에 크게 기여한다고 생각합니다. 많은 기능에 필요한 CTE 또는 하위 쿼리 WHERESELECT만들기 전에 항상 처리 됩니다. SQL Server에서 많이 볼 수 있습니다.


답변

CTE 사용 (SQL Server 2005+) :

WITH employee_rows AS (
  SELECT t.employee_id,
         ROW_NUMBER() OVER ( ORDER BY t.employee_id ) 'rownum'
    FROM V_EMPLOYEE t)
SELECT er.employee_id
  FROM employee_rows er
 WHERE er.rownum > 1

인라인보기 / 비 CTE 동등 대안 사용 :

SELECT er.employee_id
  FROM (SELECT t.employee_id,
               ROW_NUMBER() OVER ( ORDER BY t.employee_id ) 'rownum'
          FROM V_EMPLOYEE t) er
 WHERE er.rownum > 1