복붙노트

[SQL] SQL Server의 N 행을 선택

SQL

SQL 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. ==============================

    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. ==============================

    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. ==============================

    3.변수에 값이 값이 7374을 초과하는 경우, 그 문제가되지 않습니다. 그 테이블은 7374 행이 있습니다.

    변수에 값이 값이 7374을 초과하는 경우, 그 문제가되지 않습니다. 그 테이블은 7374 행이 있습니다.

  4. ==============================

    4.그것은 당신이 어떤 테이블을 생성하고 코드를 실행할 수있는 경우에, 당신은 수의 증가를 볼 수 7374. 행 (row)의 총 수는 쿼리에 대한 반환을 의미합니다

    그것은 당신이 어떤 테이블을 생성하고 코드를 실행할 수있는 경우에, 당신은 수의 증가를 볼 수 7374. 행 (row)의 총 수는 쿼리에 대한 반환을 의미합니다

  5. ==============================

    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. ==============================

    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;
    
  7. from https://stackoverflow.com/questions/32096103/selecting-n-rows-in-sql-server by cc-by-sa and MIT license