我想触发查询“SELECT * FROM TABLE
”,但只选择行N+1
。关于如何做到这一点的任何想法?
答案 0 :(得分:49)
使用此:
SELECT *
FROM Sales.SalesOrderHeader
ORDER BY OrderDate
OFFSET (@Skip) ROWS FETCH NEXT (@Take) ROWS ONLY
答案 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)
查询:sql-server
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的价值足够大时,你可以看到其显着的性能提升。
最佳性能,但仅适用于 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
不如第一个好,但与 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