2014-02-07 154 views
0

我试图在sybase数据库中找到第n行。我更熟悉SQL服务器,因此我决定使用with语句,但出于某种原因,这在sybase中不起作用。难道你们,请解释一下什么是错,此代码:在Sybase ASE中查找第n行?

With test AS 
(
    select *, row_number() over (order by M_MAT) as 'row' 
    from OM_MAT_DBF 
) 
SELECT * 
FROM test 
WHERE row = 2 
+0

术语“不工作”太含糊。这是什么意思? –

+0

关键字'With'附近的语法不正确。 – user3284817

+0

你看过文档吗? Sybase不支持“with”和“row_number”。 –

回答

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 

这将与rownumbers创建临时表。假设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命令。

+0

我究竟能够如何选择第三排?我试着使用你的代码,但它只给了我第一行,不管我是否将它从顶端2更改为顶端40 – user3284817

+0

嗯..我认为它的工作,但现在看来我错了。看起来像#temp表是要走的路。更新答案。 –

0

如果是这样,你要根据你可以使用下面的选项一些列值表的第n行:

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

这将责令基于C1列的表,给你的第三行

+0

我不知道为什么你的答案不适合我。我发布了一个修改后的答案。 –

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