在Sybase ASE中查找第n行?

时间:2014-02-07 17:05:19

标签: sql sybase sybase-ase

我正在尝试在sybase数据库中找到第n行。我对SQL服务器比较熟悉所以我决定使用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

3 个答案:

答案 0 :(得分:1)

withrow_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

这将创建带有rownumber的临时表。假设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命令。

答案 1 :(得分:0)

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

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

这将根据列C1对表格进行排序,并为您提供第3行

答案 2 :(得分:0)

不知何故,来自@ 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