2010-09-03 73 views
3

我想知道是否可以使用select语句检索行的确切位置。例如235之间的行。250.这可能吗?sql select *精确的行数

由于提前, 沙市

+4

是的,这是可能的。我会告诉你究竟如何接受你之前的问题的答案。 – 2010-09-03 12:37:53

+1

什么SQL语言?还有什么目的?如果您这样做是因为您正在显示多页面查看结果的子集? – greektreat 2010-09-03 12:38:41

回答

3

如果你使用MySQL中,你可以使用例如limit命令:

SELECT * FROM TableName LIMIT 235, 15 

其中第一个数字是开始索引,第二个是行数回来。

+0

我真的很傻,还是> = 235,<= 250仍然意味着16行,而不是15? – 2010-09-03 13:48:17

+0

16行不是吗?因为它包含了两个边界 – Malachi 2010-09-03 15:39:19

20

我不知道一般的方法..但每个DB都有一个方法。例如在Oracle中,你可以用一个嵌套的选择

甲骨文这样做:

select * from (
select a, b, c from table_foo 
where id = 124 
) 
WHERE rownum >= 235 
and ROWNUM <= 250 

MSSQL

select * from 
    (select Row_Number() over 
    (order by userID) as RowIndex, * from users) as Sub 
    Where Sub.RowIndex >= 235 and Sub.RowIndex <= 250 

MySQL的

SELECT * FROM TableName LIMIT 235, 15 
+0

谢谢大家..得到了答案 – user414977 2010-09-03 12:49:04

+1

我是不是很傻,还是> = 235和<= 250仍然意味着16行,而不是15? – 2010-09-03 13:47:49

+0

我的数学可能在边界情况下是错误的:) – bwawok 2010-09-03 14:43:53

1

不,该数据库设置不是一个序列,这意味着你没有任何特定的顺序。

但是当指定顺序比一切都简单的多。

甲骨文

SELECT * FROM (SELECT * FROM TABLE ORDER BY COLUMN) WHERE rownum BETWEEN 235 and 250 

在这种情况下,你必须使用的rownum

ROWNUM是一个伪列。它在结果集中记录了 记录。第一个 记录符合在选择语句中的哪里标准 被给出 rownum = 1,并且每个后续记录 满足相同标准增加 rownum。

MS SQL

WITH OrderedRecords AS 
(
    SELECT ColumnA, 
    ROW_NUMBER() OVER (ORDER BY ColumnA) AS 'RowNumber' 
    FROM Sales.SalesOrderHeader 
) 
SELECT * FROM OrderedRecords WHERE RowNumber BETWEEN 235 and 250 
GO 

对于这一点,你必须指定你自己的订单列


对于MySQL我不知道该怎么引擎处理这个。

+1

你认为按条款订购的产品有什么作用? – bwawok 2010-09-03 12:42:08

+0

主要指定订单,但您可能会参考它的工作原理;它依赖于数据库引擎,但通常我们可以说返回和游标以特定的顺序检索数据,为什么在oracle中我们必须使用另一个选择,而在MS SQL中,我们需要为我们赢得一行第一套。这总是被数据库使用(为什么我们可以使用别名)。 – 2010-09-03 12:53:19

0

如果你使用的是Microsoft SQL(2005>),您可以使用ROW_NUMBER函数

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 50 AND 60; 
2

这可以在SQL Server 2012中很容易做到通过使用OFFSETFETCH的新功能。这将帮助您在已排序/排序的结果集中提取所需的行。

请看下面的例子:

SELECT 
      PP.FirstName + ' ' + PP.LastName AS 'Name' 
      ,PA.City 
      ,PA.PostalCode 
FROM Person.Address PA 
      INNER JOIN 
         Person.BusinessEntityAddress PBEA 
            ON PA.AddressID = PBEA.AddressID 
      INNER JOIN 
         Person.Person PP 
            ON PBEA.BusinessEntityID = PP.BusinessEntityID 
ORDER BY PP.FirstName 
      OFFSET 0 ROWS 
       FETCH NEXT 5 ROWS ONLY 

请注意上面写的OFFSET 0 and FETCH NEXT 5
这将显示从0行开始只有5行。

+0

我们可以在PostgreSQL中做同样的事吗? – Zoran777 2017-07-27 08:07:25

0

继起我曾在甲骨文

select * from (select rownum serial,sp.* from sample_table st) sam 
where sam.serial > 10 and sam.serial <= 20;