Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Memilih Bilangan Baris Tertentu dalam Pelayan SQL dengan Cekap?
Pertanyaan 1:
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
Penjelasan:
Pertanyaan ini dihadkan oleh bilangan baris dalam jadual sys.all_columns. Oleh itu, menetapkan @Julat kepada 10,000 hanya akan mengembalikan 7,374 baris kerana itu ialah bilangan baris dalam sys.all_columns.
Pertanyaan 2:
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);
Penjelasan:
Pertanyaan alternatif ini menggunakan ungkapan jadual biasa rekursif (CTE) untuk menjana jadual nombor dari @mula hingga @akhir. PILIHAN (MAXRECURSION 0) adalah perlu untuk mengelakkan ralat pengulangan apabila membuat jadual dengan bilangan baris yang tidak terhad.
Penyelesaian CTE Bertumpuk:
Penjelasan:
Pendekatan CTE bertingkat ialah cara terpantas untuk mencipta "Tally Table" untuk bilangan baris yang banyak.
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
Kelebihan Cascaded CTE:
Atas ialah kandungan terperinci Bagaimana untuk Memilih Bilangan Baris Tertentu dalam Pelayan SQL dengan Cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!