Tôi có truy vấn này với MySQL:
select * from table1 LIMIT 10,20
Làm thế nào tôi có thể làm điều này với SQL Server?
Tôi có truy vấn này với MySQL:
select * from table1 LIMIT 10,20
Làm thế nào tôi có thể làm điều này với SQL Server?
Câu trả lời:
Bắt đầu SQL SERVER 2005, bạn có thể làm điều này ...
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;
hoặc một cái gì đó như thế này cho các phiên bản 2000 và thấp hơn ...
SELECT TOP 10 * FROM (SELECT TOP 20 FROM Table ORDER BY Id) ORDER BY Id DESC
Clunky, nhưng nó sẽ làm việc.
SELECT TOP 10 * FROM table WHERE id NOT IN (SELECT TOP 10 id FROM table ORDER BY id) FROM table ORDER BY id
Thiếu sót của MSSQL về một điều khoản LIMIT là hình sự, IMO. Bạn không cần phải thực hiện loại giải pháp này.
Bắt đầu với SQL SERVER 2012, bạn có thể sử dụng Điều khoản FFSCH OFFSET:
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/l Library / ms188385 (v = sql.110) .aspx
Điều này có thể không hoạt động chính xác khi thứ tự bởi không phải là duy nhất.
Nếu truy vấn được sửa đổi thành ORDER BY OrderDate, tập kết quả được trả về không như mong đợi.
Đây gần như là một bản sao của một câu hỏi tôi đã hỏi vào tháng 10: Giả lập mệnh đề LIMIT của MySQL trong Microsoft SQL Server 2000
Nếu bạn đang sử dụng Microsoft SQL Server 2000, không có giải pháp tốt. Hầu hết mọi người phải dùng đến việc nắm bắt kết quả của truy vấn trong một bảng tạm thời với IDENTITY
khóa chính. Sau đó truy vấn vào cột khóa chính bằng một BETWEEN
điều kiện.
Nếu bạn đang sử dụng Microsoft SQL Server 2005 trở lên, bạn có một ROW_NUMBER()
chức năng, do đó bạn có thể nhận được kết quả tương tự nhưng tránh bảng tạm thời.
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;
Bạn cũng có thể viết biểu thức này dưới dạng biểu thức bảng chung như trong câu trả lời của @Leon Tayson .
Đây là cách tôi giới hạn kết quả trong MS SQL Server 2012:
SELECT *
FROM table1
ORDER BY columnName
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY
LƯU Ý: OFFSET
chỉ có thể được sử dụng với hoặc song song vớiORDER BY
.
Để giải thích dòng mã OFFSET xx ROWS FETCH NEXT yy ROW ONLY
Các xx
bản ghi / hàng bạn muốn bắt đầu kéo từ trong bảng, nghĩa là: Nếu có 40 bản ghi trong bảng 1, mã ở trên sẽ bắt đầu kéo từ hàng 10.
Các yy
là số lượng hồ sơ / hàng bạn muốn kéo từ bảng.
Để xây dựng theo ví dụ trước: Nếu bảng 1 có 40 bản ghi và bạn bắt đầu kéo từ hàng 10 và lấy bộ 10 TIẾP THEO (yy
). Điều đó có nghĩa là, mã ở trên sẽ kéo các bản ghi từ bảng 1 bắt đầu từ hàng 10 và kết thúc ở 20. Do đó kéo các hàng 10 - 20.
Kiểm tra liên kết để biết thêm thông tin về 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
Cú pháp truy vấn giới hạn MySQL là như thế này:
SELECT * FROM table LIMIT OFFSET, ROW_COUNT
Điều này có thể được dịch sang Microsoft SQL Server như
SELECT * FROM
(
SELECT TOP #{OFFSET+ROW_COUNT} *, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rnum
FROM table
) a
WHERE rnum > OFFSET
Bây giờ truy vấn của bạn select * from table1 LIMIT 10,20
sẽ như thế này:
SELECT * FROM
(
SELECT TOP 30 *, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rnum
FROM table1
) a
WHERE rnum > 10
Đây là một trong những lý do tôi cố gắng tránh sử dụng MS Server ... nhưng dù sao đi nữa. Đôi khi bạn không có tùy chọn (yei! Và tôi phải sử dụng phiên bản lỗi thời !!).
Đề nghị của tôi là tạo một bảng ảo:
Từ:
SELECT * FROM table
Đến:
CREATE VIEW v_table AS
SELECT ROW_NUMBER() OVER (ORDER BY table_key) AS row,* FROM table
Sau đó, chỉ cần truy vấn:
SELECT * FROM v_table WHERE row BETWEEN 10 AND 20
Nếu các trường được thêm hoặc xóa, "hàng" sẽ được cập nhật tự động.
Vấn đề chính với tùy chọn này là ORDER BY đã được sửa. Vì vậy, nếu bạn muốn một thứ tự khác, bạn sẽ phải tạo một chế độ xem khác.
CẬP NHẬT
Có một vấn đề khác với cách tiếp cận này: nếu bạn cố gắng lọc dữ liệu của mình, nó sẽ không hoạt động như mong đợi. Ví dụ: nếu bạn làm:
SELECT * FROM v_table WHERE field = 'test' AND row BETWEEN 10 AND 20
WHERE trở nên giới hạn đối với những dữ liệu nằm trong các hàng trong khoảng từ 10 đến 20 (thay vì tìm kiếm toàn bộ dữ liệu và giới hạn đầu ra).
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;
Phải thử. Trong truy vấn bên dưới, bạn có thể thấy nhóm theo, sắp xếp theo, Bỏ qua các hàng và giới hạn các hàng.
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;
Giống như
SELECT * FROM table LIMIT 0,10;
Đây là một bài viết về việc thực hiện Giới hạn trong MsQuery. Đây là một bài đọc hay, đặc biệt là các bình luận.
Trong SQL không tồn tại từ khóa LIMIT. Nếu bạn chỉ cần một số lượng hàng hạn chế, bạn nên sử dụng từ khóa TOP tương tự như GIỚI HẠN.
Nếu ID của bạn là loại định danh duy nhất hoặc id của bạn trong bảng không được sắp xếp, bạn phải làm như thế này dưới đây.
select * from
(select ROW_NUMBER() OVER (ORDER BY (select 0)) AS RowNumber,* from table1) a
where a.RowNumber between 2 and 5
Mã sẽ là
chọn * từ giới hạn 2,5
sử dụng tốt hơn điều này trong MSSQLE े 2017.
SELECT * FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) as [Count], * FROM table1
) as a
WHERE [Count] BETWEEN 10 and 20;
- Tạo một cột [Đếm] và gán cho mỗi hàng một số đếm duy nhất mà không cần đặt hàng sau đó chọn lại nơi bạn có thể cung cấp giới hạn của mình .. :)
Một trong những cách có thể để có được kết quả như dưới đây, hy vọng điều này sẽ giúp ích.
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
Nếu tôi nhớ chính xác (đã được một thời gian kể từ khi tôi nhúng SQL Server), bạn có thể sử dụng một cái gì đó như thế này: (2005 trở lên)
SELECT
*
,ROW_NUMBER() OVER(ORDER BY SomeFields) AS [RowNum]
FROM SomeTable
WHERE RowNum BETWEEN 10 AND 20
WHERE
một bí danh được xác định trong cùng một SELECT
mệnh đề cấp .