2015-04-27 34 views
7

我想觸發查詢「SELECT * FROM TABLE」,但僅從行N+1中選擇。任何想法如何做到這一點?如何跳過sql查詢中的前n行

+4

是否使用的是RDBMS(f.e。甲骨文,MySQL或SQL服務器)? –

+6

哪個dbms? 「OFFSET n」是ANSI SQL,但許多dbms產品都以自己的方式來完成這項工作,例如。 LIMIT,TOP ... – jarlh

+1

此外,如果您想在給定的行號範圍內查找行,則可以使用['ROW_NUMBER']之類的函數(https://msdn.microsoft.com/zh-cn/library/ms186734的.aspx)。但這真的取決於你的dbms。 –

回答

4

查詢:在

declare @N int= 5 --Any random number 

SELECT * FROM (
     SELECT ROW_NUMBER()OVER(ORDER BY ID)AS ID 
       ,ID 
     FROM TABLE_NAME 
)AS tbl 
WHERE ID >= @N + 1 
ORDER BY tbl.ID 

這會給表,其中ID@N + 1開始的行。

+9

我不同意這個答案,這不符合你的想法。 使用此解決方案,您不會跳過N行,將N行放入ID> = N –

+0

注意*此答案僅適用於您的ID是按順序排列並且從未從此表中刪除過任何一行的情況。 –

11

SQL服務器:

select * from table 
except 
select top N * from table 

甲骨文:

select * from table 
minus 
select * from table where rownum <= N 

with TableWithNum as (
    select t.*, rownum as Num 
    from Table t 
) 
select * from TableWithNum where Num > N 

他們可能會滿足您的需求更多或更少。

有沒有直接的方式來做你想要的SQL。 但是,在我看來,這不是一個設計缺陷。

不應該像這樣使用SQL。

在關係數據庫中,表格表示一個關係,它是一個定義的集合。一個集合包含無序元素。

另外,不依賴記錄的物理順序。行順序不受RDBMS保證。

如果記錄的排序很重要,最好在表中添加一個如'Num'的列,然後使用以下查詢。這更自然。

select * 
from Table 
where Num > N 
order by Num 
+1

ANSI SQL:「select * from tablename OFFSET n」,在這種情況下,建議使用ORDER BY。 – jarlh

+1

(a)是,很好答案。看到我對這個問題的評論。 (b)在你的最後一句話中,你不需要*添加*一列,只需要'ORDER BY ...'任何一列,以獲得你需要的結果。 (c)將'ORDER BY'大寫。' – PerformanceDBA

2

什麼:

SELECT * FROM table LIMIT 50 OFFSET 1 
+3

請注意,這不適用於所有類型的SQL,因爲'LIMIT'和'OFFSET'關鍵字不是ANSI標準的一部分(參見[這個問題](http://stackoverflow.com/q/1528604/) 168775))。 – eykanal

4

你想要的東西,就像在LINQ跳過5,並採取10?

SELECT TOP(10) * 
FROM MY_TABLE 
WHERE ID not in (SELECT TOP(5) ID From My_TABLE); 
21

使用此:

SELECT * 
FROM Sales.SalesOrderHeader 
ORDER BY OrderDate 
OFFSET (@Skip) ROWS FETCH NEXT (@Take) ROWS ONLY 

https://stackoverflow.com/a/19669165/1883345

+0

注意:此查詢僅適用於SQL Server 2012及更高版本 –

-2

對於SQL2012和更高版本,最好的方法是@ MajidBasirati的答案。

我也喜歡@ CarlosToledo的答案,它不限於任何SQL Server版本,但它缺少Order By Clauses。沒有它們,它可能會返回錯誤的結果。

對於SQL 2008和更高版本,我會使用Common Table Expressions來獲得更好的性能。

-- This example omits first 10 records and select next 5 records 
;WITH MyCTE(Id) as 
(
    SELECT TOP (10) Id 
    FROM MY_TABLE 
    ORDER BY Id 
) 
SELECT TOP (5) * 
FROM MY_TABLE 
    INNER JOIN MyCTE ON (MyCTE.Id <> MY_TABLE.Id) 
ORDER BY Id 
4

爲了在SQL Server中執行此操作,您必須按列排序查詢,以便您可以指定所需的行。

例子:

select * from table order by [some_column] 
offset 10 rows 
FETCH NEXT 10 rows only 
1

這適用於所有DBRM/SQL,它是標準的ANSI:

SELECT * 
    FROM owner.tablename A 
WHERE condition 
    AND n+1 <= (
     SELECT COUNT(DISTINCT b.column_order) 
      FROM owner.tablename B 
      WHERE condition 
      AND b.column_order>a.column_order 
     ) 
ORDER BY a.column_order DESC 
+0

上面的編碼select語句跳過column_order中值較大的前n行。您可以根據需要更改條件以檢索較小的條目。 – fspino

1

我知道這是比較晚,現在來回答查詢。但我有一些不同的解決方案,我認爲它有更好的性能,因爲在SQL查詢中沒有執行比較,只有排序完成。當SKIP的值足夠大時,您可以看到其性能大幅提升。

  1. 性能最佳但只爲的SQL Server 2012及以上。原來從@Majid Basirati's answer這是值得一提的。

    DECLARE @Skip INT = 2, @Take INT = 2 
    
    SELECT * FROM TABLE_NAME 
    ORDER BY ID ASC 
    OFFSET (@Skip) ROWS FETCH NEXT (@Take) ROWS ONLY 
    
  2. 不如第一個但SQL Server 2005和以上兼容。

    DECLARE @Skip INT = 2, @Take INT = 2 
    
    SELECT * FROM 
    (
        SELECT TOP (@Take) * FROM 
        (
         SELECT TOP (@Take + @Skip) * FROM TABLE_NAME 
         ORDER BY ID ASC 
        ) T1 
        ORDER BY ID DESC 
    ) T2 
    ORDER BY ID ASC 
    
0

在Faircom SQL(這是一個僞MySQL的),我可以做到這一點的一個超級簡單的SQL語句,就像如下:

SELECT SKIP 10 * FROM TABLE ORDER BY Id 

顯然,只需更換10與你想要的任何聲明變量。

我沒有訪問MS SQL或其他平臺,但我會很驚訝MS SQL不支持這樣的事情。

0

試試下面的查詢它的工作

SELECT * FROM `my_table` WHERE id != (SELECT id From my_table LIMIT 1) 

希望這將有助於