복붙노트

[SQL] SQL ROW_NUMBER () WHERE 절에 기능

SQL

SQL ROW_NUMBER () WHERE 절에 기능

나는 WHERE 절에 ROW_NUMBER () 함수로 대답 한 질문을 발견했다. 나는 하나 개의 쿼리를 시도했을 때, 나는 다음과 같은 오류가 발생했습니다 :

여기에 내가 시도 쿼리입니다. 누군가가이 문제를 해결하는 방법을 알고 있으면 알려 주시기 바랍니다.

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

해결법

  1. ==============================

    1.이 문제를 해결하기 위해하는 CTE에 SELECT 문을 포장하고 당신은 CTE에 대해 조회 할 수 있습니다 및 WHERE 절에 윈도우 함수의 결과를 사용합니다.

    이 문제를 해결하기 위해하는 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
    
  2. ==============================

    2.

    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보다 큰 항상.

  3. ==============================

    3.

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

    4.난 당신이 뭔가를 원한다고 생각 :

    난 당신이 뭔가를 원한다고 생각 :

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

    5.인라인 뷰 또는 CTE 빨리 지 여부에 대한 rexem의 대답에 의견에 응답, 나는 쿼리가 테이블에게 I를 사용하는 개주, 모두 사용할 수 있었다 :는 sys.objects를.

    인라인 뷰 또는 CTE 빨리 지 여부에 대한 rexem의 대답에 의견에 응답, 나는 쿼리가 테이블에게 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의 간단한 교체에 같은 계획을 올 것 기대.

    물론, 차이가 있는지 확인하기 위해 자신의 시스템에 자신의 쿼리를 시도합니다.

    또한, WHERE 절에 ROW_NUMBER ()는 스택 오버플로에 주어진 답의 일반적인 오류입니다. 선택 조항이 처리 될 때까지 논리적으로 ROW_NUMBER ()는 사용할 수 없습니다. 사람들은 잊지 그들이 답을 테스트하지 않고 대답 할 때, 대답은 때때로 잘못된 것입니다. (A 충전 나 자신의 유죄 있습니다.)

  6. ==============================

    6.CTE (SQL 서버 2005 +)를 사용하여 :

    CTE (SQL 서버 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
    
  7. ==============================

    7.나는 모든 같은 CTE 또는 하위 쿼리의 사용을 보여주는 답변을 느낄 이에 대한 충분한 수정,하지만 난 사람이 영업 이익에 문제가 왜 마음에 점점 표시되지 않습니다. 영업 이익은 무엇을 제안하는 이유는없는 일이 여기에 논리적 인 질의 처리 순서에 기인 않습니다 :

    나는 모든 같은 CTE 또는 하위 쿼리의 사용을 보여주는 답변을 느낄 이에 대한 충분한 수정,하지만 난 사람이 영업 이익에 문제가 왜 마음에 점점 표시되지 않습니다. 영업 이익은 무엇을 제안하는 이유는없는 일이 여기에 논리적 인 질의 처리 순서에 기인 않습니다 :

    이와 같은 문제가 발생하는 이유는 설명 때문에, 크게 대답이 기여를 믿고있다. 항상 SELECT는 많은 기능에 대한 CTE 또는 하위 쿼리 필요하기 전에 처리입니다. 당신은 SQL 서버에서이을 많이 볼 수 있습니다.

  8. ==============================

    8.질문에 대한 영업 이익의 답변에 따라 :

    질문에 대한 영업 이익의 답변에 따라 :

    "방법 1"링크 된 질문에서 영업 이익의 질의 같고, "방법 2"선택한 답변에서 쿼리 같다. 당신이 선택한 답변에 코드가 작동하도록 수정 된 이후, 정말 무슨 일이 있었는지 볼이 답변에 링크 된 코드를 볼 수밖에 없었습니다. 이 시도:

    DECLARE @YourTable table (RowID int not null primary key identity, Value1 int, Value2 int, value3 int)
    SET NOCOUNT ON
    INSERT INTO @YourTable VALUES (1,1,1)
    INSERT INTO @YourTable VALUES (1,1,2)
    INSERT INTO @YourTable VALUES (1,1,3)
    INSERT INTO @YourTable VALUES (1,2,1)
    INSERT INTO @YourTable VALUES (1,2,2)
    INSERT INTO @YourTable VALUES (1,2,3)
    INSERT INTO @YourTable VALUES (1,3,1)
    INSERT INTO @YourTable VALUES (1,3,2)
    INSERT INTO @YourTable VALUES (1,3,3)
    INSERT INTO @YourTable VALUES (2,1,1)
    INSERT INTO @YourTable VALUES (2,1,2)
    INSERT INTO @YourTable VALUES (2,1,3)
    INSERT INTO @YourTable VALUES (2,2,1)
    INSERT INTO @YourTable VALUES (2,2,2)
    INSERT INTO @YourTable VALUES (2,2,3)
    INSERT INTO @YourTable VALUES (2,3,1)
    INSERT INTO @YourTable VALUES (2,3,2)
    INSERT INTO @YourTable VALUES (2,3,3)
    INSERT INTO @YourTable VALUES (3,1,1)
    INSERT INTO @YourTable VALUES (3,1,2)
    INSERT INTO @YourTable VALUES (3,1,3)
    INSERT INTO @YourTable VALUES (3,2,1)
    INSERT INTO @YourTable VALUES (3,2,2)
    INSERT INTO @YourTable VALUES (3,2,3)
    INSERT INTO @YourTable VALUES (3,3,1)
    INSERT INTO @YourTable VALUES (3,3,2)
    INSERT INTO @YourTable VALUES (3,3,3)
    SET NOCOUNT OFF
    
    DECLARE @PageNumber     int
    DECLARE @PageSize       int
    DECLARE @SortBy         int
    
    SET @PageNumber=3
    SET @PageSize=5
    SET @SortBy=1
    
    
    --SELECT * FROM @YourTable
    
    --Method 1
    ;WITH PaginatedYourTable AS (
    SELECT
        RowID,Value1,Value2,Value3
            ,CASE @SortBy
                 WHEN  1 THEN ROW_NUMBER() OVER (ORDER BY Value1 ASC)
                 WHEN  2 THEN ROW_NUMBER() OVER (ORDER BY Value2 ASC)
                 WHEN  3 THEN ROW_NUMBER() OVER (ORDER BY Value3 ASC)
                 WHEN -1 THEN ROW_NUMBER() OVER (ORDER BY Value1 DESC)
                 WHEN -2 THEN ROW_NUMBER() OVER (ORDER BY Value2 DESC)
                 WHEN -3 THEN ROW_NUMBER() OVER (ORDER BY Value3 DESC)
             END AS RowNumber
        FROM @YourTable
        --WHERE
    )
    SELECT
        RowID,Value1,Value2,Value3,RowNumber
            ,@PageNumber AS PageNumber, @PageSize AS PageSize, @SortBy AS SortBy
        FROM PaginatedYourTable
        WHERE RowNumber>=(@PageNumber-1)*@PageSize AND RowNumber<=(@PageNumber*@PageSize)-1
        ORDER BY RowNumber
    
    
    
    --------------------------------------------
    --Method 2
    ;WITH PaginatedYourTable AS (
    SELECT
        RowID,Value1,Value2,Value3
            ,ROW_NUMBER() OVER
             (
                 ORDER BY
                     CASE @SortBy
                         WHEN  1 THEN Value1
                         WHEN  2 THEN Value2
                         WHEN  3 THEN Value3
                     END ASC
                    ,CASE @SortBy
                         WHEN -1 THEN Value1
                         WHEN -2 THEN Value2
                         WHEN -3 THEN Value3
                     END DESC
             ) RowNumber
        FROM @YourTable
        --WHERE  more conditions here
    )
    SELECT
        RowID,Value1,Value2,Value3,RowNumber
            ,@PageNumber AS PageNumber, @PageSize AS PageSize, @SortBy AS SortBy
        FROM PaginatedYourTable
        WHERE 
            RowNumber>=(@PageNumber-1)*@PageSize AND RowNumber<=(@PageNumber*@PageSize)-1
            --AND more conditions here
        ORDER BY
            CASE @SortBy
                WHEN  1 THEN Value1
                WHEN  2 THEN Value2
                WHEN  3 THEN Value3
            END ASC
           ,CASE @SortBy
                WHEN -1 THEN Value1
                WHEN -2 THEN Value2
                WHEN -3 THEN Value3
            END DESC
    

    산출:

    RowID  Value1 Value2 Value3 RowNumber  PageNumber  PageSize    SortBy
    ------ ------ ------ ------ ---------- ----------- ----------- -----------
    10     2      1      1      10         3           5           1
    11     2      1      2      11         3           5           1
    12     2      1      3      12         3           5           1
    13     2      2      1      13         3           5           1
    14     2      2      2      14         3           5           1
    
    (5 row(s) affected
    
    RowID  Value1 Value2 Value3 RowNumber  PageNumber  PageSize    SortBy
    ------ ------ ------ ------ ---------- ----------- ----------- -----------
    10     2      1      1      10         3           5           1
    11     2      1      2      11         3           5           1
    12     2      1      3      12         3           5           1
    13     2      2      1      13         3           5           1
    14     2      2      2      14         3           5           1
    
    (5 row(s) affected)
    
  9. ==============================

    9.

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

    10.

     select salary from (
     select  Salary, ROW_NUMBER() over (order by Salary desc) rn from Employee 
     ) t where t.rn = 2
    
  11. from https://stackoverflow.com/questions/1466963/sql-row-number-function-in-where-clause by cc-by-sa and MIT license