我在SQL Server中有这个表:
ID | videoid | title
=========================
1 | id1 | title1
2 | id2 | title2
3 | id3 | title3
我想创建一个select方法,在标题行中搜索:
SELECT * FROM [movie].[dbo].[movies]
WHERE title like '%' + '%s' + '%'
我正在寻找类似MySQL的限制,从SELECT
结果中我可以获得0-20,21-40,41-60
结果。
对此查询有何帮助?
我尝试使用LIMIT 0, 10
并收到此错误:
Could not find stored procedure 'LIMIT'.
答案 0 :(得分:6)
您需要将TOP N
与SQL SERVER一起使用。
SELECT TOP 10 * FROM [movie].[dbo].[movies]
WHERE title like '%' + '%s' + '%'
ORDER BY SomeColumn -- Specify your column for ordering
将查询结果集中返回的行限制为指定的数字 SQL Server
中的行数或行百分比
在SELECT语句中,始终对TOP使用ORDER BY子句 条款。这是可预测地指示哪些行的唯一方法 受TOP影响。
如果您正在寻找寻呼记录,那么您将需要ROW_NUMBER
答案 1 :(得分:3)
在T-SQL中没有等价物。 TOP
允许您仅从结果集中获取第一个x
结果。你可以用一招。使用ROW_NUMBER
,您可以添加一个从1开始并自动递增的新列。
像这样:
SELECT ROW_NUMBER OVER (SomeExpression), Field FROM ...
然后你可以使用
SELECT TOP x FROM
(
SELECT ROW_NUMBER OVER (ORDER BY ID) AS RowNumber, ID, videoid, title FROM ...
) tmp
WHERE RowNumber > Y ORDER BY RowNumber ASC
诀窍是这个编号独立于其他字段,因此使用相同的过滤器,您将始终获得相同的RowNumber
,因此可以再次过滤 。这模仿了LIMIT
的作用。
例如,要获得条目1 - 9个条目,您可以写:
SELECT TOP 9 FROM
(
SELECT ROW_NUMBER OVER (ORDER BY ID) AS RowNumber, ID, videoid, title FROM ...
) tmp
WHERE RowNumber >= 1 ORDER BY RowNumber ASC
下一页:
SELECT TOP 9 FROM
(
SELECT ROW_NUMBER OVER (ORDER BY ID) AS RowNumber, ID, videoid, title FROM ...
) tmp
WHERE RowNumber >= 10 ORDER BY RowNumber ASC
答案 2 :(得分:3)
在 SQL Server 2012 中,引入了一项提供此功能的新功能。
的OFFSET部分SELECT *
FROM your_table
ORDER
BY some_column
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY
这将返回结果集的结果20-30(按some_column
排序)
对于 SQL Server 2005 - 2008R2 ,您可以使用窗口函数执行相同的操作:
SELECT *
FROM (
SELECT *
, Row_Number() OVER (ORDER BY some_column) As sequence
FROM your_table
) As a_subquery
WHERE sequence >= 20
AND sequence <= 30
对于SQL Server 2005 之前的SQL Server 版本,没有有效的方法来实现此效果。这就是诀窍:
SELECT *
FROM (
SELECT *
, (
SELECT Count(*)
FROM your_table As x
WHERE x.some_column <= your_table.some_column
) As sequence
FROM your_table
) As a_subquery
WHERE sequence >= 20
AND sequence <= 30
最终说明,您的结果为deterministic some_column
应该是唯一的。如果不是,则需要在等式中添加额外的列,以便为序列提供确定的排序顺序。
另请注意,应在所有生产代码中避免使用SELECT * ...
。不要懒惰[就像我在这个答案中;-)
] - 只列出 所需的列。
答案 3 :(得分:2)
使用Top
:
SELECT TOP 1 * FROM [movie].[dbo].[movies]
WHERE title like '%' + '%s' + '%'
当TOP与ORDER BY子句一起使用时,结果集仅限于前N个有序行;否则,它以未定义的顺序返回前N行。
了解更多here。
要获得10-20之类的结果,请使用ROW_NUMBER
:
SELECT TOP 10 * FROM
(SELECT ROW_NUMBER() OVER (id_field) as SlNo, ID, videoid, title
FROM TableName) T
WHERE SlNo>=10
ORDER BY id_field
答案 4 :(得分:1)
我不认为SQL服务器中有LIMIT
。请改用TOP
。 TOP
返回查询的前N行,所以如果它是TOP 10
,即使你有一千行,它也只会返回第一行。试试这个......
SELECT TOP 60 *
FROM [movie].[dbo].[movies]
WHERE title like '%' + '%s' + '%'
答案 5 :(得分:0)
您可以使用以下方法:
方法1: ORDER BY
SELECT *
FROM [movie].[dbo].[movies]
WHERE title like '%' + '%s' + '%'
ORDER BY ID OFFSET 21 ROWS FETCH NEXT 20 ROWS ONLY
方法2: ROW_NUMBER
SELECT *
FROM ( SELECT *,
ROW_NUMBER()OVER (ORDER BY ID)row
FROM [movie].[dbo].[movies]
WHERE title like '%' + '%s' + '%'
)z
WHERE row>20
AND row<=40
方法3:前N
SELECT TOP 20 *
FROM ( SELECT TOP 40 *
FROM [movie].[dbo].[movies]
WHERE title like '%' + '%s' + '%'
ORDER BY ID
)z
ORDER BY ID DESC