我试图在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
我试图在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
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
这将与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
命令。
我究竟能够如何选择第三排?我试着使用你的代码,但它只给了我第一行,不管我是否将它从顶端2更改为顶端40 – user3284817
嗯..我认为它的工作,但现在看来我错了。看起来像#temp表是要走的路。更新答案。 –
如果是这样,你要根据你可以使用下面的选项一些列值表的第n行:
select *
from xyz X where 3 > (
select count(*)
from xyz
where C1 > X.C1
)
order by C1
这将责令基于C1
列的表,给你的第三行
我不知道为什么你的答案不适合我。我发布了一个修改后的答案。 –
不知何故,来自@ 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'附近的语法不正确。 – user3284817
你看过文档吗? Sybase不支持“with”和“row_number”。 –