我正在尝试在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
答案 0 :(得分:1)
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
这将创建带有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