2010-09-03 36 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;