Saya punya pertanyaan ini dengan MySQL:
select * from table1 LIMIT 10,20
Bagaimana saya bisa melakukan ini dengan SQL Server?
Saya punya pertanyaan ini dengan MySQL:
select * from table1 LIMIT 10,20
Bagaimana saya bisa melakukan ini dengan SQL Server?
Jawaban:
Mulai SQL SERVER 2005, Anda dapat melakukan ini ...
USE AdventureWorks;
GO
WITH OrderedOrders AS
(
SELECT SalesOrderID, OrderDate,
ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
FROM Sales.SalesOrderHeader
)
SELECT *
FROM OrderedOrders
WHERE RowNumber BETWEEN 10 AND 20;
atau sesuatu seperti ini untuk versi 2000 dan di bawah ...
SELECT TOP 10 * FROM (SELECT TOP 20 FROM Table ORDER BY Id) ORDER BY Id DESC
Kikuk, tapi itu akan berhasil.
SELECT TOP 10 * FROM table WHERE id NOT IN (SELECT TOP 10 id FROM table ORDER BY id) FROM table ORDER BY id
Penghapusan klausa LIMIT MSSQL adalah kriminal, IMO. Anda tidak harus melakukan penyelesaian seperti ini.
Dimulai dengan SQL SERVER 2012, Anda dapat menggunakan OFFSET FETCH Clause:
USE AdventureWorks;
GO
SELECT SalesOrderID, OrderDate
FROM Sales.SalesOrderHeader
ORDER BY SalesOrderID
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;
GO
http://msdn.microsoft.com/en-us/library/ms188385(v=sql.110).aspx
Ini mungkin tidak berfungsi dengan benar ketika pesanan oleh tidak unik.
Jika kueri diubah menjadi ORDER BY OrderDate, hasil yang dikembalikan tidak seperti yang diharapkan.
Ini hampir merupakan duplikat dari pertanyaan yang saya ajukan pada bulan Oktober: Meniru klausa LIMIT MySQL di Microsoft SQL Server 2000
Jika Anda menggunakan Microsoft SQL Server 2000, tidak ada solusi yang baik. Sebagian besar orang harus menggunakan untuk menangkap hasil kueri dalam tabel sementara dengan IDENTITY
kunci utama. Kemudian kueri terhadap kolom kunci utama menggunakan BETWEEN
kondisi.
Jika Anda menggunakan Microsoft SQL Server 2005 atau lebih baru, Anda memiliki ROW_NUMBER()
fungsi, sehingga Anda bisa mendapatkan hasil yang sama tetapi menghindari tabel sementara.
SELECT t1.*
FROM (
SELECT ROW_NUMBER OVER(ORDER BY id) AS row, t1.*
FROM ( ...original SQL query... ) t1
) t2
WHERE t2.row BETWEEN @offset+1 AND @offset+@count;
Anda juga dapat menulis ini sebagai ekspresi tabel umum seperti yang ditunjukkan pada jawaban @Leon Tayson .
Ini adalah bagaimana saya membatasi hasil dalam MS SQL Server 2012:
SELECT *
FROM table1
ORDER BY columnName
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY
CATATAN: OFFSET
hanya dapat digunakan dengan atau bersama-sama dengan ORDER BY
.
Untuk menjelaskan baris kode OFFSET xx ROWS FETCH NEXT yy ROW ONLY
Ini xx
adalah nomor record / baris yang ingin Anda tarik dari dalam tabel, yaitu: Jika ada 40 catatan dalam tabel 1, kode di atas akan mulai menarik dari baris 10.
The yy
adalah jumlah record / baris Anda ingin menarik dari meja.
Untuk membangun contoh sebelumnya: Jika tabel 1 memiliki 40 catatan dan Anda mulai menarik dari baris 10 dan ambil set NEXT dari 10 ( yy
). Itu berarti, kode di atas akan menarik catatan dari tabel 1 mulai dari baris 10 dan berakhir pada 20. Dengan demikian menarik baris 10 - 20.
Lihat tautan untuk info lebih lanjut tentang OFFSET
SELECT *
FROM (
SELECT TOP 20
t.*, ROW_NUMBER() OVER (ORDER BY field1) AS rn
FROM table1 t
ORDER BY
field1
) t
WHERE rn > 10
Permintaan MySQL LIMIT secara sintaksis adalah seperti ini:
SELECT * FROM table LIMIT OFFSET, ROW_COUNT
Ini dapat diterjemahkan ke dalam Microsoft SQL Server seperti
SELECT * FROM
(
SELECT TOP #{OFFSET+ROW_COUNT} *, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rnum
FROM table
) a
WHERE rnum > OFFSET
Sekarang permintaan Anda select * from table1 LIMIT 10,20
akan seperti ini:
SELECT * FROM
(
SELECT TOP 30 *, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rnum
FROM table1
) a
WHERE rnum > 10
Ini adalah salah satu alasan saya mencoba untuk menghindari menggunakan MS Server ... tetapi tetap. Kadang-kadang Anda tidak memiliki opsi (yei! Dan saya harus menggunakan versi yang sudah usang !!).
Saran saya adalah membuat tabel virtual:
Dari:
SELECT * FROM table
Untuk:
CREATE VIEW v_table AS
SELECT ROW_NUMBER() OVER (ORDER BY table_key) AS row,* FROM table
Maka cukup kueri:
SELECT * FROM v_table WHERE row BETWEEN 10 AND 20
Jika bidang ditambahkan, atau dihapus, "baris" diperbarui secara otomatis.
Masalah utama dengan opsi ini adalah bahwa ORDER BY sudah diperbaiki. Jadi jika Anda menginginkan urutan yang berbeda, Anda harus membuat tampilan lain.
MEMPERBARUI
Ada masalah lain dengan pendekatan ini: jika Anda mencoba memfilter data Anda, itu tidak akan berfungsi seperti yang diharapkan. Misalnya, jika Anda melakukannya:
SELECT * FROM v_table WHERE field = 'test' AND row BETWEEN 10 AND 20
DI MANA menjadi terbatas pada data yang berada di baris antara 10 dan 20 (alih-alih mencari seluruh dataset dan membatasi output).
SELECT
*
FROM
(
SELECT
top 20 -- ($a) number of records to show
*
FROM
(
SELECT
top 29 -- ($b) last record position
*
FROM
table -- replace this for table name (i.e. "Customer")
ORDER BY
2 ASC
) AS tbl1
ORDER BY
2 DESC
) AS tbl2
ORDER BY
2 ASC;
-- Examples:
-- Show 5 records from position 5:
-- $a = 5;
-- $b = (5 + 5) - 1
-- $b = 9;
-- Show 10 records from position 4:
-- $a = 10;
-- $b = (10 + 4) - 1
-- $b = 13;
-- To calculate $b:
-- $b = ($a + position) - 1
-- For the present exercise we need to:
-- Show 20 records from position 10:
-- $a = 20;
-- $b = (20 + 10) - 1
-- $b = 29;
Harus dicoba. Di kueri di bawah ini, Anda bisa melihat grup berdasarkan, pesan berdasar, Lewati baris, dan bataskan baris.
select emp_no , sum(salary_amount) from emp_salary
Group by emp_no
ORDER BY emp_no
OFFSET 5 ROWS -- Skip first 5
FETCH NEXT 10 ROWS ONLY; -- limit to retrieve next 10 row after skiping rows
SELECT TOP 10 * FROM table;
Sama dengan
SELECT * FROM table LIMIT 0,10;
Inilah artikel tentang menerapkan Batas dalam MSSQL. Ini adalah bacaan yang bagus, khususnya komentar.
Di SQL tidak ada kata kunci LIMIT. Jika Anda hanya membutuhkan jumlah baris terbatas, Anda harus menggunakan kata kunci TOP yang mirip dengan LIMIT.
Jika ID Anda adalah tipe pengidentifikasi unik atau id dalam tabel Anda tidak diurutkan, Anda harus melakukan seperti ini di bawah ini.
select * from
(select ROW_NUMBER() OVER (ORDER BY (select 0)) AS RowNumber,* from table1) a
where a.RowNumber between 2 and 5
Kodenya akan
pilih * dari batas 2,5
lebih baik gunakan ini di MSSQLExpress 2017.
SELECT * FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) as [Count], * FROM table1
) as a
WHERE [Count] BETWEEN 10 and 20;
--Memberikan Kolom [Hitungan] dan menugaskan setiap baris penghitungan unik tanpa memesan sesuatu lalu pilih kembali di mana Anda dapat memberikan batasan Anda .. :)
Salah satu cara yang mungkin untuk mendapatkan hasil seperti di bawah ini, harap ini akan membantu.
declare @start int
declare @end int
SET @start = '5000'; -- 0 , 5000 ,
SET @end = '10000'; -- 5001, 10001
SELECT * FROM (
SELECT TABLE_NAME,TABLE_TYPE, ROW_NUMBER() OVER (ORDER BY TABLE_NAME) as row FROM information_schema.tables
) a WHERE a.row > @start and a.row <= @end
Jika saya ingat dengan benar (sudah lama sejak saya mengoleskan SQL Server), Anda mungkin dapat menggunakan sesuatu seperti ini: (2005 dan lebih tinggi)
SELECT
*
,ROW_NUMBER() OVER(ORDER BY SomeFields) AS [RowNum]
FROM SomeTable
WHERE RowNum BETWEEN 10 AND 20
WHERE
alias yang ditentukan dalam SELECT
klausa level yang sama .