带有限制的SQL查询

时间:2014-03-17 13:05:01

标签: 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的限制,从SELECT结果中我可以获得0-20,21-40,41-60结果。

对此查询有何帮助?

我尝试使用LIMIT 0, 10并收到此错误:

Could not find stored procedure 'LIMIT'.

6 个答案:

答案 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

请参阅:TOP (Transact-SQL)

  

将查询结果集中返回的行限制为指定的数字   SQL Server

中的行数或行百分比

另请查看Best Practices in docs

  

在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 中,引入了一项提供此功能的新功能。

查看the ORDER BY clause

的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。请改用TOPTOP返回查询的前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