C# 带限制的SQL查询
我在SQL Server中有此表:C# 带限制的SQL查询,c#,sql,sql-server,C#,Sql,Sql Server,我在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中寻
ID | videoid | title
=========================
1 | id1 | title1
2 | id2 | title2
3 | id3 | title3
我想创建一个select方法,在标题行中搜索:
SELECT * FROM [movie].[dbo].[movies]
WHERE title like '%' + '%s' + '%'
我在MySQL中寻找类似Limit的东西,从SELECT结果中我可以得到0-20,21-40,41-60的结果
有关于这个问题的帮助吗
我尝试使用限制0和10,但收到以下错误:
Could not find stored procedure 'LIMIT'.
使用顶部:
当TOP与ORDERBY子句一起使用时,结果集被限制为前N个有序行;否则,它将以未定义的顺序返回前N行
阅读更多
要获得类似10-20的结果,请使用行号:
您需要在SQL SERVER中使用TOP N
SELECT TOP 10 * FROM [movie].[dbo].[movies]
WHERE title like '%' + '%s' + '%'
ORDER BY SomeColumn -- Specify your column for ordering
见:
将查询结果集中返回的行限制为指定的数目
SQL Server中的行数或行百分比
也看看下面
在SELECT语句中,始终将ORDER BY子句与TOP
条款这是可预测地指示哪些行是
受顶部影响
如果您正在查找分页记录,那么您将需要我认为SQL server没有限制。改用TOP。TOP返回查询的前N行,因此如果它是前10行,即使有1000行,它也只返回前10行。试试这个
SELECT TOP 60 *
FROM [movie].[dbo].[movies]
WHERE title like '%' + '%s' + '%'
在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
诀窍在于,此编号独立于其他字段,因此使用相同的筛选器,您将始终获得相同的行号,从而可以再次进行筛选。这模仿了极限的作用
例如,要获取条目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
在SQL Server 2012中,引入了一项新功能来提供此功能
请看这张照片的偏移部分
这将返回按某个列排序的结果集的结果20-30
对于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
最后一点:要想让你的结果更真实,某个列应该是唯一的。如果不是,则需要在等式中添加额外的列,为序列提供确定的排序顺序
还请注意,选择*。。。应避免在所有生产代码中使用。不要偷懒[就像我在这个答案中;-]-只列出所需的列。为此,您可以使用以下方法: 方法1:按订单 方法2:行数
另外,我认为您的“%”太多了。您使用此sql的目标是什么?您打算在哪里使用它?可能重复使用@RaimondKuipers我想构建Web服务,以获取搜索字符串并从sql数据库返回结果。但我希望每次返回20个结果,而不是所有结果。@MTA,您是每次返回20个结果,还是希望根据分页返回结果,如第一次调用0-20,第二次调用20-40?这不允许分页作为限制,然而,这并没有达到极限,因为你不能得到10-20的结果。@ThorstenDittmar:谢谢。编辑我的答案。如果没有ORDER BY,TOP没有任何意义,应该使用Yes for paging。如果没有ORDER BY,TOP没有任何意义。@ThorstenDittmar,你确定吗?因为我认为SELECT只是以不确定的顺序返回记录,是不是因为TOP关键字,返回的结果会按照PK的顺序排列?@ThorstenDittmar几乎总是@gvee这是真的,但在某些情况下,就像在我们客户的数据库中一样,我只需要从一组行中获取第一个值,因为它对于所有行都是相等的,所以我不需要ORDER BY。有人可以理直气壮地说,数据模型本身就是一个WTF,但这不是本文的主题:-D
SELECT *
FROM your_table
ORDER
BY some_column
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY
SELECT *
FROM (
SELECT *
, Row_Number() OVER (ORDER BY some_column) As sequence
FROM your_table
) As a_subquery
WHERE sequence >= 20
AND sequence <= 30
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
SELECT *
FROM [movie].[dbo].[movies]
WHERE title like '%' + '%s' + '%'
ORDER BY ID OFFSET 21 ROWS FETCH NEXT 20 ROWS ONLY
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
SELECT TOP 20 *
FROM ( SELECT TOP 40 *
FROM [movie].[dbo].[movies]
WHERE title like '%' + '%s' + '%'
ORDER BY ID
)z
ORDER BY ID DESC