[SQL] SQL ROW_NUMBER () WHERE 절에 기능
SQLSQL 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.이 문제를 해결하기 위해하는 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.
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.
Select * from ( Select ROW_NUMBER() OVER ( order by Id) as 'Row_Number', * from tbl_Contact_Us ) as tbl Where tbl.Row_Number = 5
-
==============================
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.인라인 뷰 또는 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.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.나는 모든 같은 CTE 또는 하위 쿼리의 사용을 보여주는 답변을 느낄 이에 대한 충분한 수정,하지만 난 사람이 영업 이익에 문제가 왜 마음에 점점 표시되지 않습니다. 영업 이익은 무엇을 제안하는 이유는없는 일이 여기에 논리적 인 질의 처리 순서에 기인 않습니다 :
나는 모든 같은 CTE 또는 하위 쿼리의 사용을 보여주는 답변을 느낄 이에 대한 충분한 수정,하지만 난 사람이 영업 이익에 문제가 왜 마음에 점점 표시되지 않습니다. 영업 이익은 무엇을 제안하는 이유는없는 일이 여기에 논리적 인 질의 처리 순서에 기인 않습니다 :
이와 같은 문제가 발생하는 이유는 설명 때문에, 크게 대답이 기여를 믿고있다. 항상 SELECT는 많은 기능에 대한 CTE 또는 하위 쿼리 필요하기 전에 처리입니다. 당신은 SQL 서버에서이을 많이 볼 수 있습니다.
-
==============================
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.
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.
select salary from ( select Salary, ROW_NUMBER() over (order by Salary desc) rn from Employee ) t where t.rn = 2
from https://stackoverflow.com/questions/1466963/sql-row-number-function-in-where-clause by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 당신은 어떻게 T-SQL에서 기본 값 또는 유사한 제약 조건을 삭제합니까? (0) | 2020.06.04 |
---|---|
[SQL] SQL 서버와 마지막 행을 읽는 방법 (0) | 2020.06.04 |
[SQL] PostgreSQL을 - SQL - 'TRUE'값의 계산 (0) | 2020.06.04 |
[SQL] 왜 내 SQL 키워드를 대문자로해야합니까? [복제] (0) | 2020.06.04 |
[SQL] SSRS보고에 어떻게 형식의 날짜와 시간을합니까? (0) | 2020.06.04 |