Sql 在Sybase ASE中查找第n行?

Sql 在Sybase ASE中查找第n行?,sql,sybase,sap-ase,Sql,Sybase,Sap Ase,我正在尝试查找sybase数据库中的第n行。我更熟悉SQL server,所以我决定使用with语句,但由于某些原因,它在sybase中不起作用。你们能解释一下这个代码有什么问题吗 With test AS ( select *, row_number() over (order by M_MAT) as 'row' from OM_MAT_DBF ) SELECT * FROM test WHERE row = 2 with和row_number在Sybase ASE中是无效的命

我正在尝试查找sybase数据库中的第n行。我更熟悉SQL server,所以我决定使用with语句,但由于某些原因,它在sybase中不起作用。你们能解释一下这个代码有什么问题吗

With test AS 
(
  select *, row_number() over (order by M_MAT) as 'row'
  from OM_MAT_DBF
) 
SELECT *
FROM test
WHERE row = 2
with和row_number在Sybase ASE中是无效的命令

一个选项是将数据或键数据选择到临时表中,然后使用该临时表查找要查找的行

set rowcount 13      --Use the row number you are looking for to limit rows returned
select rownumber=identity(10), M_MAT
  into #temp
  from OM_MAT_DBF
  order by M_MAT
set rowcount 0
这将创建带有行号的临时表。假设M_MAT是唯一字段:

select * 
  from OM_MAT_DBF
  where M_MAT =
    (
    select M_MAT 
    from #temp where rownumber = 13   --And find your requested row
    )

如果您计划在一个事务中选择多行,则在创建临时表时始终可以绕过set rowcount命令。

如果您想要基于某个列值的表的第n行,则可以使用以下选项:

select *
from xyz X where 3 > (
    select count(*)
    from xyz
    where C1 > X.C1
)
order by C1

这将根据C1列对表进行排序,并给您第3行

不知何故,@Xint0的应答器对我不起作用。我结束了对它的修改:

DROP TABLE #Data go

CREATE TABLE #Data (Datum INT, PRIMARY KEY (Datum))
INSERT INTO #Data VALUES (10)
INSERT INTO #Data VALUES (20)
INSERT INTO #Data VALUES (30)
INSERT INTO #Data VALUES (40)
INSERT INTO #Data VALUES (50)
INSERT INTO #Data VALUES (60)

DECLARE @n INT
SET @n = 4 -- find the n-th value

DECLARE @t INT
SELECT @t = count(*) - @n + 1 FROM #Data
SELECT TOP 1 *
FROM #Data X WHERE @t > (
 SELECT count(*)
 FROM #Data
 WHERE Datum > X.Datum
)
ORDER BY Datum

“不工作”这个词太模糊了。在这个例子中是什么意思?关键字“With”附近的语法不正确。你看过文档了吗?Sybase不支持with和row_number。例如,如何准确地选择第三行?我试着使用你的代码,但不管我把它从前2名改为前40名,它都只给我第一行。嗯……我原以为它有效,但现在看来我错了。看来临时表格是最好的选择。更新答案。我不知道为什么你的答案不适合我。我已经发布了一个修改过的答案。