Sql DB2中的行数()
如何在DB2数据库的where子句中使用ROW_NUMBER。 我尝试了以下方法,但无效:Sql DB2中的行数(),sql,db2,Sql,Db2,如何在DB2数据库的where子句中使用ROW_NUMBER。 我尝试了以下方法,但无效: SELECT * FROM CSPAPP.LOCATIONS WHERE (ROW_NUMBER() OVER(ORDER BY LOCATION)) BETWEEN 100 AND 200 它给出了错误:聚合函数或OLAP函数的使用无效 我还尝试了以下方法: SELECT (ROW_NUMBER() OVER(ORDER BY LOCATION)) AS RN ,* FROM CSPAPP.LOCAT
SELECT * FROM CSPAPP.LOCATIONS
WHERE (ROW_NUMBER() OVER(ORDER BY LOCATION)) BETWEEN 100 AND 200
它给出了错误:聚合函数或OLAP函数的使用无效
我还尝试了以下方法:
SELECT (ROW_NUMBER() OVER(ORDER BY LOCATION)) AS RN ,* FROM CSPAPP.LOCATIONS
WHERE RN < 200
SELECT (ROW_NUMBER() OVER(ORDER BY LOCATION)) AS RN ,LOCATION FROM CSPAPP.LOCATIONS
WHERE RN < 200
不能在定义别名的同一级别上引用别名。您需要将其包装到派生表中:
SELECT location
FROM (
SELECT row_number() over(order by location) as rn,
location
FROM cspapp.locations
)
WHERE rn < 200
SELECT T1.* FROM(
SELECT row_number() over(order by location) as rn ,L.*
FROM cspapp.locations L) As T1
WHERE T1.rn < 200
在iSeries DB2中基于行数进行选择时,我会使用如下方法:
SELECT *
FROM (
SELECT ROW_NUMBER() OVER(ORDER BY location) as RRN, *
FROM CSPAPP.LOCATIONS
)
WHERE RRN between 100 and 200
如果您只对1字段感兴趣,您可以为该字段指定一个名称,然后选择并引用字段:
SELECT DATA.location
FROM (
SELECT ROW_NUMBER() OVER(ORDER BY location) as RRN, *
FROM CSPAPP.LOCATIONS
) as DATA
WHERE DATA.RRN between 100 and 200
可以在定义别名的同一级别上引用别名。您需要将其包装到派生表中:
SELECT location
FROM (
SELECT row_number() over(order by location) as rn,
location
FROM cspapp.locations
)
WHERE rn < 200
SELECT T1.* FROM(
SELECT row_number() over(order by location) as rn ,L.*
FROM cspapp.locations L) As T1
WHERE T1.rn < 200
但你应该明白,这永远都不是最好的做法。您应该使用列名而不是*L.col1。您可以尝试仅获取前200行,而不是行号。写下您的选择,就像您通常没有行_编号一样,按您需要的顺序排序,然后取第一个x
使用*选择所有列不是一种好的做法,尤其是如果您有600多列,而这本身就是数据库的糟糕设计。不使用行数函数:
SELECT * FROM
(SELECT * FROM CSPAPP.LOCATIONS ORDER BY LOCATION FETCH FIRST 200 rows only)
ORDER BY LOCATION DESC FETCH FIRST 100 rows only;
With Row number:
SELECT ROW_NUMBER() OVER(ORDER BY LOCATIONS), LOCATIONS as RNM FROM
(SELECT * FROM CSPAPP.LOCATIONS ORDER BY LOCATIONS FETCH FIRST 200 rows only)
ORDER BY LOCATIONS DESC FETCH FIRST 100 rows only;
非常感谢您的解决方案,但它部分地满足了我的需要。我正在尝试从以下位置选择*:选择按位置超额订购的行号为rn,*从rn<200但不起作用的cspapp.locations。您能建议吗?对不起。错误为:按位置为rn的“”找到意外令牌*。预期令牌可能包括:。我不能输入每一列,因为表中大约有600列。所以我必须使用*一次性选择所有列。可能位置在DB2中是一个保留字,我不知道。我认为select column_name,*from table_name在DB2中是不允许的,这在SQL Server中是允许的。有什么想法吗???然后加上前缀*:选择行号,table_name.*从table_name或使用别名感谢您的帮助。我尝试了以下方法:从cspapp.locations中选择*位置从SELECT row_中选择位置编号按位置超额订购为rno,从cspapp.locations中选择位置rno介于1000和10000之间。效果很好。