[SQL] SQL Server의 N 행을 선택
SQLSQL Server의 N 행을 선택
다음 쿼리는 10 행 ~ 10을 반환합니다.
DECLARE @Range AS INT = 10
;WITH CTE AS(
SELECT TOP (@Range) Duration = ROW_NUMBER() OVER(ORDER BY OBJECT_ID)
FROM sys.all_columns
ORDER BY [Object_id]
)
SELECT Duration from CTE
나는 10000로 @range을 설정할 때 그러나 7374 개 행을 반환합니다. 왜이 쿼리 개 이상의 7374 개 행을 반환 할 수 없습니다.
최신 정보
다음과 같은 난 그냥 내 요구 사항을 달성하기 위해 다른 방법을 발견
DECLARE @start INT = 1;
DECLARE @end INT = 10;
WITH numbers AS (
SELECT @start AS number
UNION ALL
SELECT number + 1
FROM numbers
WHERE number < @end
)
SELECT *
FROM numbers
OPTION (MAXRECURSION 0);
코드의 마지막 줄이 없으면이 오류 최대 재귀 100 문이 완료되기 전에 소진 된 함께 나누기 나는이 라인은 무한 재귀 0을 지정하는 것입니다 발견했다. 그러나이 쿼리 나에게 느린 조금 보인다. 빨리 방법이 있나요 ???
해결법
-
==============================
1.이전 주석으로 당신이 sys.columns의 행의 수에 도달 때문입니다. 여기에 숫자 또는 어떤 다른 사람이 숫자 테이블 또는 탈리 표 전화의 목록을 생성하는 또 다른 방법입니다.
이전 주석으로 당신이 sys.columns의 행의 수에 도달 때문입니다. 여기에 숫자 또는 어떤 다른 사람이 숫자 테이블 또는 탈리 표 전화의 목록을 생성하는 또 다른 방법입니다.
이 용도는 열팽창 계수를 캐스케이드와 탈리 표를 만들 수있는 가장 빠른 방법이라고합니다 :
DECLARE @Range AS INT = 7374 ;WITH E1(N) AS( -- 10 ^ 1 = 10 rows SELECT 1 FROM(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t(N) ), E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b), -- 10 ^ 2 = 100 rows E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b), -- 10 ^ 4 = 10,000 rows E8(N) AS(SELECT 1 FROM E4 a CROSS JOIN E4 b), -- 10 ^ 8 = 10,000,000 rows CteTally(N) AS( SELECT TOP(@Range) ROW_NUMBER() OVER(ORDER BY(SELECT NULL)) FROM E8 ) SELECT * FROM CteTally
당신이 10,000 개 이상의 행을해야 할 경우 당신은 쉽게 다른 CTE를 추가 할 수 있습니다.
탈리 표에 대한 자세한 내용은 제프 MODEN하여이 우수한 기사를 읽어 보시기 바랍니다.
방법 사이의 성능 비교가 탈리 테이블을 생성하는 경우,이 읽기.
제프의 기사에서 가져온 설명 :
-
==============================
2.십자가를 사용하는 것입니다 숫자의 큰 시리즈를 생성하는 방법 중 하나는 N ^ 2 크기 인 세트를 생성하는 두 테이블 사이의 카티 제품을 만들기 위해 가입 할 수 있습니다.
십자가를 사용하는 것입니다 숫자의 큰 시리즈를 생성하는 방법 중 하나는 N ^ 2 크기 인 세트를 생성하는 두 테이블 사이의 카티 제품을 만들기 위해 가입 할 수 있습니다.
이 방법은 그러나이 솔루션은 펠릭스 Pamittan에 의해이 질문에 대해 제시하기 때문에 사용해서는 안보다 훨씬 더 수행한다.
DECLARE @Range AS INT = 10000 ;WITH CTE AS( SELECT TOP (@Range) Duration = ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) FROM sys.all_columns a CROSS JOIN sys.all_columns b ) SELECT Duration from CTE
이것은 귀하의 경우 54,375,876 행 세트를 생성합니다. 대신 즉석에서 행을 생성하는 당신은 당신의 요구 사항에 맞는 집계 테이블을 만드는 것이 좋습니다.
-
==============================
3.변수에 값이 값이 7374을 초과하는 경우, 그 문제가되지 않습니다. 그 테이블은 7374 행이 있습니다.
변수에 값이 값이 7374을 초과하는 경우, 그 문제가되지 않습니다. 그 테이블은 7374 행이 있습니다.
-
==============================
4.그것은 당신이 어떤 테이블을 생성하고 코드를 실행할 수있는 경우에, 당신은 수의 증가를 볼 수 7374. 행 (row)의 총 수는 쿼리에 대한 반환을 의미합니다
그것은 당신이 어떤 테이블을 생성하고 코드를 실행할 수있는 경우에, 당신은 수의 증가를 볼 수 7374. 행 (row)의 총 수는 쿼리에 대한 반환을 의미합니다
-
==============================
5.이 행의 최대 수는 7374이기 때문에, 그 상호 자체에 조인 당신이 master..spt_Values 테이블을 사용할 수 있습니다 당신이 원하는 기간 열에 6,325,225 값을 얻을 것입니다.
이 행의 최대 수는 7374이기 때문에, 그 상호 자체에 조인 당신이 master..spt_Values 테이블을 사용할 수 있습니다 당신이 원하는 기간 열에 6,325,225 값을 얻을 것입니다.
DECLARE @Range AS INT = 10000 ;WITH CTE AS( SELECT TOP (@Range) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) Duration FROM master..spt_values a cross join master..spt_values b ) SELECT Duration from CTE
-
==============================
6.나는 실행 번호를 얻기 위해이 기능을 사용합니다. 직접 (... 가입 또는 적용 또는 사용)에서 사용할 수 있습니다
나는 실행 번호를 얻기 위해이 기능을 사용합니다. 직접 (... 가입 또는 적용 또는 사용)에서 사용할 수 있습니다
다른 의견을 읽은 후 나는 "스택 CTE"접근 방식이 변경 (펠릭스에 들으)
CREATE FUNCTION [dbo].[GetRunningNumbers](@anzahl INT=10000000, @StartAt INT=0) RETURNS TABLE AS RETURN WITH E1(N) AS( -- 10 ^ 1 = 10 rows SELECT 1 FROM(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t(N) ), E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b), -- 10 ^ 2 = 100 rows E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b), -- 10 ^ 4 = 10,000 rows E8(N) AS(SELECT 1 FROM E4 a CROSS JOIN E4 b), -- 10 ^ 8 = 10,000,000 rows CteTally AS( SELECT TOP(ISNULL(@anzahl,1000000)) ROW_NUMBER() OVER(ORDER BY(SELECT NULL)) -1 + ISNULL(@StartAt,0) As Nmbr FROM E8 ) SELECT * FROM CteTally;
from https://stackoverflow.com/questions/32096103/selecting-n-rows-in-sql-server by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 시간을 줄이기 위해 선택 MySQL을 다시 쓰기 디스크에 TMP를 작성 (0) | 2020.04.08 |
---|---|
[SQL] mysql_num_rows도 () : 제공된 인수가 유효한 MySQL의 결과 리소스 아니다 [중복] (0) | 2020.04.08 |
[SQL] 어떻게 다양한 형식 SQLite는의 피벗 또는 즉 선택에 표는 긴 형식으로 저장? (0) | 2020.04.08 |
[SQL] MySQL은 여러 열을 기준으로 순위를 결정 (0) | 2020.04.08 |
[SQL] PostgreSQL을 가진 피벗 테이블 만들기 (0) | 2020.04.08 |