如何跳过sql查询中的前n行

时间:2015-04-27 11:37:38

标签: sql

我想触发查询“SELECT * FROM TABLE”,但只选择行N+1。关于如何做到这一点的任何想法?

12 个答案:

答案 0 :(得分:49)

使用此:

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

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

答案 1 :(得分:17)

SQL Server:

select * from table
except
select top N * from table

Oracle高达11.2:

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

Oracle 12.1及更高版本(遵循标准ANSI SQL)

select *
from table
order by some_column 
offset x rows
fetch first y rows only

他们可能或多或少地满足您的需求。

没有直接的方法可以通过SQL执行您想要的操作。 但是,在我看来,这不是一个设计缺陷。

不应该像这样使用SQL。

在关系数据库中,表表示关系,它是按定义设置的。集合包含无序元素。

此外,不依赖于记录的实际顺序。 RDBMS无法保证行顺序。

如果记录的顺序很重要,您最好添加一个列,例如“Num&#39;到表中,并使用以下查询。这更自然。

select * 
from Table 
where Num > N
order by Num

答案 2 :(得分:9)

查询:

DECLARE @N INT = 5 --Any random number

SELECT * FROM (
        SELECT ROW_NUMBER() OVER(ORDER BY ID) AS RoNum
              , ID --Add any fields needed here (or replace ID by *)
        FROM TABLE_NAME
) AS tbl 
WHERE @N < RoNum
ORDER BY tbl.ID

这将给出Table的行,其中rownumber从@N + 1开始。

答案 3 :(得分:8)

为了在SQL Server中执行此操作,您必须按列排序查询,以便指定所需的行。

示例:

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

答案 4 :(得分:6)

你想要LINQ中的东西跳过5并取10?

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

此方法适用于任何SQL版本。 Order子句对于避免随机结果很重要。

答案 5 :(得分:4)

我知道现在回答这个问题已经很晚了。但是我的解决方案与我认为具有更好性能的其他解决方案略有不同,因为在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
    

答案 6 :(得分:3)

怎么样:

SELECT * FROM table LIMIT 50 OFFSET 1

答案 7 :(得分: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

答案 8 :(得分:0)

在Faircom SQL(伪MySQL)中,我可以在超级简单的SQL语句中执行此操作,如下所示:

SELECT SKIP 10 * FROM TABLE ORDER BY Id

显然,您可以将10替换为您想要的任何声明变量。

我无法访问MS SQL或其他平台,但我会非常惊讶MS SQL不支持这样的内容。

答案 9 :(得分:0)

尝试下面查询它的工作

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

希望这会有所帮助

答案 10 :(得分:-1)

您也可以像这样使用 OFFSET 从查询结果中删除第一条记录-

示例 - 从员工表中找到第二个最高工资

select distinct salary from employee order by salary desc limit 1 OFFSET 1

答案 11 :(得分:-2)

对于SQL Server 2012及更高版本,最好的方法是@ MajidBasirati的答案。

我也很喜欢@ CarlosToledo的答案,它不仅限于任何SQL Server版本,但它缺少Order By Clauses。没有它们,它可能会返回错误的结果。

对于SQL Server 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