sql >> Databáze >  >> RDS >> Sqlserver

Výběr N řádků v SQL Server

Jak již bylo uvedeno dříve, je to proto, že jste dosáhli počtu řádků sys.columns . Zde je další způsob, jak vygenerovat seznam čísel nebo to, co ostatní nazývají Numbers Table nebo Tally Table .

Toto používá kaskádové CTE s a údajně je to nejrychlejší způsob, jak vytvořit tabulku sčítání:

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

Pokud potřebujete více než 10 000 řádků, můžete snadno přidat další CTE.

Pro více informací o Tally Table si přečtěte tento skvělý článek od Jeffa Modena.

Chcete-li porovnat výkon mezi způsoby generování tabulek sčítání, přečtěte si toto .

Vysvětlení převzato z Jeffova článku:

CTE nazval E1 (jako v 10E1 pro vědeckou notaci) není nic jiného než deset SELECT 1 's se vrátí jako jedna sada výsledků.

E2 provede CROSS JOIN z E1 sám se sebou. To vrátí sadu jednotlivých výsledků 10*10 nebo až 100 řádků. Říkám "až", protože pokud je funkce TOP 100 nebo méně, CTE jsou dostatečně "chytré" na to, aby věděly, že ve skutečnosti není třeba jít dále a E4 a E8 ani nevstoupí do hry. Pokud je TOP má hodnotu menší než 100, ne všech 100 řádků, které E2 je schopen vyrobit bude vyroben. Vždy to bude stačit podle TOP funkce.

Odtud můžete sledovat. E4 je CROSS JOIN z E2 a vytvoří až 100*100 nebo 10 000 řádků a E8 je CROSS JOIN z E4 které vytvoří více řádků, než kolik lidí kdy bude potřebovat. Pokud jste udělali více, přidejte E16 jako CROSS JOIN z E8 a změňte finální FROM klauzule na FROM E16 .

Na tomhle padouchovi je opravdu úžasné, že produkuje ZEROREADS . Absolutně žádný, nada, nula.



  1. odstranění milisekund z pole Oracle tmstmp

  2. Apache Spark:Připojení JDBC nefunguje

  3. STRING_SPLIT() v SQL Server 2016:Následná akce #1

  4. Práce s MyISAM v MySQL