Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Memilih N baris di SQL Server

Seperti yang dikomentari sebelumnya, itu karena Anda mencapai jumlah baris sys.columns . Berikut adalah cara lain untuk menghasilkan daftar angka atau yang orang lain sebut Numbers Table atau Tally Table .

Ini menggunakan CTE berjenjang s dan dikatakan sebagai cara tercepat untuk membuat Tabel Tally:

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

Anda dapat dengan mudah menambahkan CTE lain jika Anda membutuhkan lebih dari 10.000 baris.

Untuk informasi lebih lanjut tentang Tabel Penghitungan, baca artikel yang luar biasa ini oleh Jeff Moden.

Untuk perbandingan kinerja di antara cara menghasilkan Tabel Penghitungan, baca ini .

Penjelasan diambil dari artikel Jeff:

CTE disebut E1 (seperti dalam 10E1 untuk notasi ilmiah) tidak lebih dari sepuluh SELECT 1 's dikembalikan sebagai satu set hasil.

E2 melakukan CROSS JOIN dari E1 dengan dirinya sendiri. Itu mengembalikan satu set hasil 10*10 atau hingga 100 baris. Saya katakan "sampai" karena jika fungsi TOP 100 atau kurang, CTE cukup "pintar" untuk mengetahui bahwa itu sebenarnya tidak perlu melangkah lebih jauh dan E4 dan E8 bahkan tidak akan ikut bermain. Jika TOP memiliki nilai kurang dari 100, tidak semua 100 baris yang E2 mampu membuat akan dibuat. Itu akan selalu membuat cukup sesuai dengan TOP fungsi.

Anda dapat mengikuti dari sana. E4 adalah CROSS JOIN dari E2 dan akan membuat hingga 100*100 atau 10.000 baris dan E8 adalah CROSS JOIN dari E4 yang akan membuat lebih banyak baris daripada yang dibutuhkan kebanyakan orang. Jika Anda melakukan lebih banyak, tambahkan saja E16 sebagai CROSS JOIN dari E8 dan ubah FROM terakhir klausa ke FROM E16 .

Apa yang benar-benar menakjubkan tentang bocah nakal ini adalah menghasilkan ZEROREADS . Sama sekali tidak ada, nada, nihil.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jenis teks SQL Server vs. tipe data varchar

  2. Mengapa mengeksekusi prosedur tersimpan lebih cepat daripada kueri SQL dari skrip?

  3. Hitung berdasarkan kondisi di SQL Server

  4. Cara membuat kueri pivot di server sql tanpa fungsi agregat

  5. 50 Pertanyaan Wawancara SQL Server Teratas yang Harus Anda Siapkan Di 2022